มีวิธีใดที่ผู้โจมตีสามารถใช้ mkdir เพื่อประนีประนอมระบบ


22

ฉันกำลังตั้งค่าบัญชีผู้ใช้ที่ถูก จำกัด สำหรับผู้ใช้ผู้ใช้ricardoที่ลำบากในระบบของฉัน ฉันต้องการให้สิทธิ์แก่เขาในการสร้างไดเรกทอรีsudoซึ่งบางครั้งเขาจำเป็นต้องทำ ฉันกำลังพิจารณากฎนี้ใน/etc/sudoersไฟล์ของฉัน:

ricardo   ALL=(root) NOPASSWD: /bin/mkdir

การใช้กฎนี้เท่านั้นจะมีวิธีอื่นใดที่ริคาร์โด้อาจตั้งใจหรือไม่ตั้งใจทำระบบ?


2
หากคุณมีระบบไฟล์ที่มีจำนวน inode แบบคงที่เขาสามารถใช้ไอโหนดทั้งหมดของคุณได้
jordanm

2
@schaiba เขาชอบคนจรจัดและดูว่าเขาสามารถใช้ประโยชน์จากระบบได้หรือไม่และอ่านหน้าคนไม่มากเท่าที่ควร
Ricardo Altamirano

8
การให้ความรู้แก่ผู้ใช้ที่เหมาะสมเมื่อรวมกับไม่มี sudo ในตอนนั้นเป็นสิ่งที่ควรทำจากฉัน
schaiba

2
ดังที่ @schaiba พูดว่าคุณสามารถใช้ผู้ใช้ดังกล่าวได้โดยการสอนพวกเขาและให้ความรับผิดชอบแก่พวกเขา (ภายใต้การดูแลอย่างใกล้ชิด) ฉันเคยเห็นสงครามระหว่าง sysdamins และผู้ใช้เป็นคนแรกที่พยายามล็อคระบบมากเกินไป ผู้ใช้มีจำนวนมากกว่า sysadmins 10 ต่อ 1 และถึงตอนนั้น ( โดยไม่ต้องเชื่อมต่ออินเทอร์เน็ตในปัจจุบัน!) ความพ่ายแพ้ของ sysdamins นั้นน่าอับอาย ไม่เคยเข้าไปในตำแหน่งดังกล่าว!
vonbrand

2
นั่นเป็นกรณีของริคาร์โด้หนึ่งคนมากเกินไป หรืออย่างน้อยก็พูดกับ BOFH ...
Deer Hunter

คำตอบ:


21

ฉันสงสัยว่าการโจมตีเช่นนี้จะใช้งานได้ซึ่ง«สิ่งที่»เป็นโมดูลเคอร์เนลที่จะพยายามโหลดหลังจากติดตั้งรูท:

$ sudo mkdir -m 777 /lib/modules/`uname -r`/a
$ cp evil.ko /lib/modules/`uname -r`/a/«something».ko

โปรดทราบว่าคุณสามารถใช้ชื่ออื่นได้ขึ้นอยู่กับนามแฝงที่ประกาศในโมดูล ฉันเดาว่ามันจะไม่โหลดจนกว่า depmod จะทำงานซึ่งจะเกิดขึ้นในครั้งต่อไปที่มีการอัปเดตเคอร์เนลดังนั้นmkdirจะไม่แสดงแม้แต่ในบันทึก sudo เมื่อเร็ว ๆ นี้

มีหลายสิ่งใน / etc ที่อ่านไฟล์ทั้งหมดในไดเรกทอรีซึ่งบางครั้งจะเรียกซ้ำ ที่แย่กว่านั้นคือบางส่วนของไดเรกทอรีเหล่านั้นไม่มีอยู่โดยค่าเริ่มต้นและวิธีเดียวที่จะรู้เกี่ยวกับพวกเขาคือการอ่าน manpage, สคริปต์เริ่มต้นและอื่น ๆ สำหรับโปรแกรมที่ใช้พวกเขา บางสิ่งที่เลวร้ายยิ่งกว่านั้นถูกคัดค้านสิ่งที่เข้ากันได้ย้อนหลังและอาจไม่ได้รับการบันทึกไว้อีกต่อไป

แก้ไข:ความคิดของไดเรกทอรีเพิ่มเติมไม่กี่เหล่านี้ใน/usr/local:

  • /usr/local/lib/perl/5.14.2(แตกต่างกันขึ้นอยู่กับรุ่น Perl ลองperl -Vค้นหา) สร้างFileไดเรกทอรีย่อยในนั้นและใส่ไว้Find.pmในนั้น ตอนนี้เมื่อใดก็ตามที่ใครก็ตามใช้File::Findพวกเขาจะใช้เวอร์ชันของผู้โจมตี Getopt::Longในทำนองเดียวกันการทำเช่นเดียวกันกับ ยูทิลิตีของระบบมักจะเขียนด้วย Perl ดังนั้นนี่อาจทำให้รูท (ลองack-grep --color -a 'use.+::' /usr/sbin | less -R)
  • ฉันคิดว่า Python, Ruby และอื่น ๆ มีไดเรกทอรีที่คล้ายกัน ยูทิลิตีของระบบนั้นเขียนด้วย Python เช่นกัน
  • ล้มล้างหลายสิ่ง compiles /usr/local/includeคนที่มีไดเรกทอรีย่อยของ

โอ้ แต่ถ้า <ผู้ใช้ชั่วร้าย> สามารถคัดลอกโมดูลไปยังตำแหน่งที่เคอร์เนลจะโหลดพวกเขาเกมจะจบก่อนที่จะเริ่ม
vonbrand

1
@vonbrand <evil user> ปกติไม่สามารถทำได้ แต่ใช้ของเขาsudo mkdirเพื่อสร้างไดเรกทอรีใหม่ที่สามารถทำได้
derobert

20

ด้วยการรันmkdirในฐานะรูทผู้ใช้สามารถบล็อกกระบวนการ / ผู้ใช้อื่น ๆ จากการสร้างไฟล์และไดเรกทอรีใหม่โดยการสร้างไดเรกทอรีที่มีชื่อเหมือนกัน (และ / หรือสิทธิ์ผิด) มาก่อน

นี่อาจเป็นเรื่องความปลอดภัยที่เกี่ยวข้องโดยเฉพาะอย่างยิ่งกับไฟล์บันทึกและไฟล์ล็อค

ตามที่jordanmตั้งข้อสังเกตจำนวนสูงสุดของinodesสามารถถูกใช้จนหมดซึ่งสามารถบล็อกทั้งระบบได้

โดยการเพิ่มผู้ใช้ให้กับกลุ่มเฉพาะ (หรือใช้ACLs ) คุณควรจะสามารถแก้ปัญหาได้โดยไม่ต้องให้สิทธิใด ๆ sudoผ่านทาง


จุดที่ดี ฉันอาจจะทิ้งmkdirรายการคำสั่ง ricardo ที่ได้รับอนุญาตให้ใช้
Ricardo Altamirano

ถ้ามันใช้สำหรับการ inodes ที่เหนื่อยง่ายfor((i = 0;; i++)); do touch $i; doneก็จะทำได้ดี (bashism, ขออภัย; แต่คุณได้ความคิด)
vonbrand

@ vonbrand ยกเว้นว่าไม่เป็นรูทดังนั้นโควต้าจึงจะถูกระงับ แน่นอนsudoคำสั่งอื่น ๆ ที่OP กำลังพิจารณาอาจช่วยให้ไอโหนดหมดไปเช่นกัน OP จำเป็นต้องตระหนักถึงเวกเตอร์ DoS นั้น
Derobert

11

คุณควรพาเขาไปที่คุก chroot หรือดียิ่งขึ้นไปยัง VM เล็ก ๆ น้อย ๆ ที่เขาสามารถพังได้หนึ่งครั้งต่อชั่วโมง สิ่งที่คุณต้องทำคือเตรียมสำเนาใหม่


ฉันขอแนะนำอย่างนี้ ให้สิทธิ์การเข้าถึงรูตแก่เขาบน VM ของเขาเอง
emory

เพื่อ chroot ^ H ^ H ^ H ^ H ^ Hounty คุก ...
Deer Hunter

6

มีความเป็นไปได้เนื่องจากความสามารถในการสร้างไดเรกทอรีที่มีสิทธิ์การเขียน ด้วยผู้ใช้สามารถเขียนสิ่งที่พวกเขาต้องการลงในไดเรกทอรีใหม่ คุณจะต้องมีกระบวนการในระบบที่รันอยู่แล้วในฐานะผู้ใช้อื่นที่จะลดทรีไดเรกทอรีเพื่อโหลดการกำหนดค่าสคริปต์หรือโมดูล จากนั้นผู้ใช้อาจเพิ่มสิ่งต่าง ๆ ของตนเองเพื่อโหลดหรือเรียกใช้ สิ่งแรกที่ฉันคิดได้ก็คือถ้าคุณเรียกใช้เว็บเซิร์ฟเวอร์ที่สามารถรัน php หรือ cgi ได้ จากนั้นคุณสามารถเรียกใช้สคริปต์ในฐานะผู้ใช้รายนั้นได้ ฉันกำลังดิ้นรนเพื่อหาตัวอย่างจากโลกแห่งความเป็นจริงให้มากขึ้นโดยเฉพาะอย่างยิ่งสิ่งที่ฉันกำลังแน่ใจ mkdir -m 777 blahricardoroot

ssh เป็นตัวอย่างของ daemon ที่ดักจับสถานการณ์ประเภทนี้ หากคุณสร้าง.sshไดเรกทอรีสำหรับผู้ใช้ที่ไม่มีและวางauthorized_hostsไฟล์ของคุณเอง sshdแจ้งให้ทราบว่าการอนุญาตไดเรกทอรีเปิดเกินไปและละเว้นคีย์สาธารณะ

แน่นอนว่าคุณอาจสร้างความรำคาญให้กับตัวเองในการสร้างไดเรกทอรีที่คาดว่าไฟล์จะเปิดขึ้น (เช่น transient tmp หรือ swap file) ซึ่งโปรแกรมจำนวนมากไม่สามารถจัดการได้อย่างดี

คุณสามารถสร้างกลุ่ม cg ได้มากมาย แต่มันไม่ได้ดูว่าคุณทำอะไรกับพวกเขา คุณอาจนำระบบมาใช้อย่างน้อยก็คุกเข่า มันใช้เวลาประมาณ 10,000 กลุ่ม cg ในกล่องที่มี 256M สำหรับนักฆ่า OOMที่จะออก sshd

หากคุณควบคุม-mตัวเลือกmkdirและ UMASK ของsudoสภาพแวดล้อมฉันคิดว่ามันกลับเป็นแค่ความรำคาญ

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