ทดลอง Shellshock บน OS X

พอดีเห็นว่าบน Mac มันทดลองง่ายดี ยังไม่มี patch ออกมาด้วย

Screen Shot 2557-09-27 at 11.35.31 PM

 

OS X มี web server ติดมาในตัว ใช้รัน CGI ง่ายๆได้ แค่เอาไฟล์ไปวางไว้ใน /Library/WebServer/CGI-Executables/ ยกตัวอย่างไฟล์​ test.sh

 

Screen Shot 2557-09-27 at 11.44.32 PM

ไม่เคยเขียน CGI web app ด้วย bash มาก่อน (อันนี้ก็อันแรก ด้วยความอยากรู้)​ ตอนรันก็แค่เปิด http://localhost/cgi-bin/test.sh

Screen Shot 2557-09-27 at 11.46.37 PM

เป็นไปตามที่คิด — เข้าเรื่อง Shellshock เราก็จะฝังพวก command เข้าไปใน HTTP headers บางตัว ซึ่งโดยการทำงานของ CGI แล้ว headers พวกนี้ก็จะถูกเอาไปทำเป็น environment variables สำหรับตัว bash ที่จะถูกเรียกขึ้นมา (อ่านเรื่อง environement var และ CGI ที่นี่) ถ้าเปลี่ยนโค้ดนิดหน่อยเป็น

echo -e “<html><body><pre>$(env)</pre></body></html>”;

ก็จะเห็นชัดขึ้นว่ามันเข้าไปอยู่เป็น environment variables จริงๆ

Screen Shot 2557-09-27 at 11.55.16 PM

ลองใช้คำสั่ง curl แล้วฝังคอมมานด์ชั่วร้าย (!) ลง header เพื่อใช้ Shellshock ดู

curl -H ‘Referer:() { :; }; echo “uh oh! muhahahahha” > /tmp/msg_from_me.txt‘ http://localhost/cgi-bin/test.sh

แน่นอนว่า content ดังกล่าวก็จะไปโผล่ในไฟล์ /tmp/msg_from_me.txt

คำถาม: วิธี attack แบบนี้ทำได้เฉพาะกับ CGI ที่เขียนด้วย bash เหรอ สมัยนี้ใครเค้าจะทำอะไรแบบนี้กัน! ไปเขียน Java (!) สิครัช

คำตอบ: ถ้ามีวิธียัด command ใดๆใส่ environment variables แล้วเรียก bash (รุ่นที่มีปัญหา) ขึ้นมาทำงานได้ มันก็โดนเล่นงานได้หมด

บังเอิญว่ากลไกของ CGI มันเอาข้อมูลบางส่วนใน HTTP request ไปใส่ใน env ให้เองเสมอ ก็เลยเป็นช่องทางให้เล่นงานได้

ยกตัวอย่างเช่น Perl

Screen Shot 2557-09-28 at 12.18.45 AM

(ต้องเรียก bash ตรงๆใน backticks ไม่งั้นมันใช้ shell ตัว default ตัวอื่นนะจ๊ะ)

หรือถ้าเป็น PHP ที่รันบน Apache ที่ใช้ mod_cgi และเรียก bash ขึ้นมาทำงานผ่าน exec() หรืออะไรก็ตามแต่ ก็มีความเสี่ยงเช่นกัน (ไม่สันทัด PHP เลยไม่ได้ลองเล่นดู)

เข้าใจว่าสมัยนี้ไม่น่าจะมีคนรัน CGI web app แล้วนะ ตัวเลือกดีๆอย่างอื่นมันเยอะกว่า แต่ก็ยังอยากเห็นช่องทางโจมตีช่องอื่นอีก สำหรับคนดูแลระบบแค่ update bash ไปน่าจะง่ายสุด

ขอบคุณ Everything you need to know about the Shellshock Bash bug ที่ทำให้เห็นว่ามันทดลองง่ายดีจริงๆ

Share Button

Comments

comments