วิธีการหา Crontab ผู้ลี้ภัย


17

ไม่กี่ปีที่ผ่านมาฉันตั้งค่างาน cron เป็น ping URL โดยอัตโนมัติทุกนาทีเป็นส่วนหนึ่งของระบบการตรวจสอบ เพราะฉันเป็นคนที่น่ากลัวฉันจึงไม่บันทึกที่นี่

วันนี้หลายปีต่อมาฉันเริ่มมีปัญหากับแอปพลิเคชันที่ส่วนอื่น ๆ ของ URL ที่ถูก ping ฉันแก้ไขมัน แต่แล้วก็รู้ว่าฉันไม่รู้ว่างาน cron นี้มาจากไหน

มีวิธีการค้นหาอย่างรวดเร็วหรือตัด crontabs ทั้งหมดในระบบใดระบบหนึ่งหรือไม่? ฉันมีสิทธิ์เข้าถึงระดับรากดังนั้นการอนุญาตจึงไม่ใช่ปัญหา ฉันเคยเป็นผู้ใช้cronฉันไม่เคยมองลึกลงไปที่การติดตั้งมัน แต่สัญชาตญาณของฉัน * nix บอกว่าจะต้องมีกลุ่มของไฟล์ข้อความที่ไหนสักแห่งที่ถือ crontabs ทั้งหมด ฉันไม่ทราบว่าพวกเขาจะอยู่ที่ไหนและถ้าฉันขุดลงไปฉันจะกลัวที่จะหาบางอย่าง แต่ไม่ใช่ทั้งหมดของพวกเขาหรือหายไปนิดหน่อยแปลก ๆ ของระบบ

นอกจากนี้ฉันยังตระหนักถึงการเข้าถึงรูทที่ทำได้

  1. รับรายชื่อผู้ใช้ทั้งหมดในระบบ
  2. su ในฐานะผู้ใช้
  3. crontab -l
  4. ทำซ้ำกับผู้ใช้ทั้งหมด

แต่ฉันกำลังมองหาคู่มือน้อยกว่าเล็กน้อย (และต้องการเรียนรู้บางอย่างเกี่ยวกับการใช้ cron)


2
คุณอาจต้องดูที่ลิงค์นี้ - stackoverflow.com/questions/134906/…
Daniel t

คำตอบ:


20

มีเพียงไม่กี่ที่ที่ crontabs สามารถซ่อนได้:

  • /etc/crontab
  • /etc/cron.d/*
  • /etc/crond.{hourly,daily,weekly,monthly}/*
    สิ่งเหล่านี้ถูกเรียกจาก/etc/crontabดังนั้นอาจเป็นเครื่องหมายดอกจันในเรื่องนี้
  • /var/spool/cron/*(บางครั้ง/var/spool/cron/crontabs/*)

ตรวจสอบให้แน่ใจเพื่อตรวจสอบatเช่นกันซึ่งทำให้งานใน/var/spool/at/หรือ/var/spool/cron/at*/

นอกจากนี้แทน

su <user>
crontab -l

แค่ทำสิ่งนี้:

crontab -lu <user>

8

Crontabs อาศัยอยู่/etc/crontabและ (มีการนำไปใช้งานหลายอย่าง) ส่วนประกอบของมันใน/etc/cron.*/*(แก้ไขทั้งหมดโดย root) และใน/var/spool/cron/*(crontabs ของผู้ใช้)

หากคุณมีปัญหาในการหางานที่กระทำผิดวิธีอื่นคือการตรวจสอบในขณะที่กำลังดำเนินการอยู่ ตัวอย่างเช่นคุณสามารถเพิ่มกฎไฟร์วอลล์เพื่อบันทึก id ผู้ใช้ของกระบวนการเปิดการเชื่อมต่อไปยังexample.comพอร์ต 80:

iptables -A OUTPUT -p tcp --syn -d example.com --dport 80 -j LOG --log-prefix "[->example.com] " --log-uid

หากงานกำลังใช้งานแอปพลิเคชันเช่นpingหรือcurlให้เงาไบนารีปกติโดย wrapper ที่บันทึกข้อมูลเกี่ยวกับสิ่งที่กำลังใช้งานโดยมีสคริปต์แบบนี้ใน/usr/local/bin:

#!/bin/sh
{
  date
  echo "$0" "$@"
  ps -p $PPID
  echo
} >>"/tmp/$(basename "$0").log"
exec "/usr/bin/$(basename "$0")" "$@"

+1 เพราะมันแสดงวิธีแก้ปัญหาเพื่ออธิบายตัวเอง!
โจ

6

วิธีที่รวดเร็วและสกปรก:

grep -r ping /var/spool/cron/crontabs

ตำแหน่งที่แน่นอนที่จัดเก็บcrontabsอาจแตกต่างกันไปในแต่ละระบบ แต่โดยทั่วไปแล้วจะ/var/spoolมีcrontabอยู่ในชื่อ

นอกจากนี้ทราบว่าหลายระบบมีระบบ crontabs (เหมือนใน/etc/crontab, /etc/cron.d) บางส่วนที่อาจจะเรียกสคริปต์มากขึ้นเช่น/etc/cron.hourly, .daily...


4

ฟังดูเหมือน cronjob ที่สร้างโดย crontab ไม่ใช่ crontabs ทั้งหมดที่มี-uสวิตช์ แต่สำหรับ GNU / Linux จะสามารถใช้งานได้ นี่เป็นรายการที่สะดวกในการแสดง cronjobs ทั้งหมดที่สร้างโดย crontab

for user in $(awk -F':' '{ print $1}' /etc/passwd); do crontab -u $user -l; done

(เรียกใช้ในฐานะรูท)


2

หากสิ่งอื่นล้มเหลวคุณสามารถสร้าง honeypot จาก URL ที่ร้องขอ - เช่นให้บริการไฟล์ขนาดใหญ่หรือบางอย่าง - และค้นหากระบวนการที่รอรับข้อมูลจากนั้นค้นหา PPID ของมัน


2

ระบบที่ดีใด ๆ ควรอธิบายตำแหน่งที่แม่นยำของ crontabs ใน manpage (โดยปกติจะอยู่ในFILESส่วนใกล้ถึงจุดสิ้นสุดและสำหรับdæmonsอื่น ๆ )

ในระบบของฉันเช่นcron(8)มีดังต่อไปนี้:

 FILES
      /etc/crontab          system crontab file
      /var/cron/atjobs      directory containing at(1) jobs
      /var/cron/log         cron's log file
      /var/cron/tabs        directory containing individual crontab files
      /var/cron/tabs/.sock  used by crontab(1) to tell cron to check for
                            crontab changes immediately

และฉันขอแนะนำที่สองของไทเลอร์ให้ตรวจสอบatงานในขณะที่คุณอยู่ด้วย


2

ใกล้เข้าหาอีกด้านหนึ่ง: cron เก็บบันทึกสิ่งที่กำลังทำอยู่อย่างแม่นยำเพื่อหลีกเลี่ยงปัญหาประเภทนี้ในตอนแรก ในระบบของฉันบันทึกจะถูกเก็บไว้ใน/var/cron/logและมีลักษณะเช่นนี้:

==> /var/cron/log <==
Oct 25 00:21:01 fortress cron[20232]: (vucar) CMD (/home/vucar/lighttpd-watchdog)

บรรทัดนี้บอกฉันว่าเช่น cron กับ PID 20232 ในเครื่องfortressจะดำเนินการในนามของผู้ใช้/home/vucar/lighttpd-watchdog vucarระบบที่ทำงานได้ดีมีเพียง cron เดียวที่ใช้งานดังนั้นสิ่งนี้จะตรงไปตรงมา

สิ่งนี้ใช้ได้กับatงานด้วยเนื่องจากพวกเขามักจะส่งให้ cron อยู่ดี:

==> /var/cron/log <==
Oct 25 00:28:01 fortress cron[31282]: (vucar) ATJOB (1414189680.c)

ตัวอย่างมาจากระบบ BSD แต่แนวคิดทั่วไปมีความเหมือนกันทุกที่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.