CVE-2018
CVE-2018-2628
CVE-2018-2628 เป็นช่องโหว่ Deserialize ใน Oracle Weblogic version 10.3.6.0, 12.1.3.0, 12.2.1.2, 12.2.1.3 ซึ่งทำให้ผู้โจมตีสามารถเข้าสั่งการเครื่องเป้าหมายได้ โดยช่องโหว่นี้เกิดในส่วน WLS Core Components ซึ่งก็คือ port console 7001 (default port) โดยการโจมตีจะกระทำผ่าน port 7001 ซึ่งเป็น T3 protocol โดยไม่จำเป็นต้องมีการเข้าสู่ระบบก่อนแต่อย่างใด
CVE-2018-7600 [DRUPALGEDDON2]
CVE-2018-7600 หรือ SA-CORE-2018-002 เป็นช่องโหว่ Remote Code Execution ใน Drupal ซึ่งเป็น CMS (Content Management System) ที่ถูกใช้ทำเว็บไซด์มากมาย โดย Drupal ที่ได้รับผลกระทบจะเป็น version 7.x, 8.3.x, 8.4.x และ 8.5.x โดยช่องโหว่ดังกล่าว โดยช่องโหว่ดังกล่าวได้ชื่อว่า Drupalgeddon2 เนื่องด้วยการโจมตีช่องโหว่ดังกล่าว ทำให้ผู้โจมตีสามารถเข้ายึดเครื่องได้โดยไม่จำเป็นต้องเข้าสู่ระบบก่อนแต่อย่างใด (Unauthentication)
โดยข่องโหว่ดังกล่าวเกิดในส่วน FORM API ซึ่งข้อมูลที่ถูกใช้งานผ่าน Form API ดังกล่าว จะเรียกว่า Renderable Arrays ซึ่งเป็นชนิดตัวแปรที่ถูกใช้ใน Drupal
โดยข่องโหว่ดังกล่าวเกิดในส่วน FORM API ซึ่งข้อมูลที่ถูกใช้งานผ่าน Form API ดังกล่าว จะเรียกว่า Renderable Arrays ซึ่งเป็นชนิดตัวแปรที่ถูกใช้ใน Drupal
[
‘#type’ => ‘markup’,
‘#markup’ => ‘<em>some text</em>’,
‘#prefix’ => ‘<div>’,
‘#suffix’ => ‘</div>’
]
ตัวอย่าง Render Array โดย Checkpoint [****Source::https://research.checkpoint.com/uncovering-drupalgeddon-2/]**
การแปลงจาก Render Array ไปเป็น HTML Output Source::http://ionemind.com/content/render-render-array-html-code
การแปลงจาก Render Array ไปเป็น HTML Output Source::http://ionemind.com/content/render-render-array-html-code
ข้อมูลในรูปแบบ Render Arrays จะถูกเก็บใน Array ที่มี key เป็นตัว index และ value ซึ่งการจะถูกเรียกใช้ทุกๆครั้งจะใช้เครื่องหมาย # นำหน้าค่า key เสมอ โดยช่องโหว่ที่เกิดขึ้นเกิดใน Form ของการ register ใหม่ซึ่งถูกเข้าถึงได้โดยคนทั่วไปนั่นเอง
โดยตัวอย่าง payload ของการโจมตีจะเป็นตามด้านล่าง
โดยตัวอย่าง payload ของการโจมตีจะเป็นตามด้านล่าง
POST /user/register?element_parents=account/mail/%23value&ajax_form=1 HTTP/1.1
Host: drupal.url
Content-Length: 76
Content-Type: application/x-www-form-urlencoded
mail[%23post_render][]=exec&mail[%23children]=pwd&form_id=user_register_form
โดย Request ดังกล่าวจะถูกส่งไปยัง uploadAjaxCallBack() ในไฟล์ core/modules/file/src/Element/ManagedFile.php ผ่าน parameter element_parents จากนั้นจะเรียกใช้ function explode() โดยใช้ / เป็นตัวขั้น (delimeter) จากนั้นจะถูกเก็บไปในตัวแปร $form_parents
โดยค่า $form_parents ที่ได้จาก explode() จะได้ออกมาเป็น
โดยค่า $form_parents ที่ได้จาก explode() จะได้ออกมาเป็น
array(3) {
[0]=> string(7) "account"
[1]=> string(4) "mail"
[2]=> string(6) "#value"
}
จากนั้นตัวแปร $form และ $form_parents จะถูกดึงค่าออกมาจาก key ที่ขึ้นต้นด้วย # แล้วเก็บเข้า $form เมื่อเสร็จแล้วจะถูกนำไปแสดงผล (render) โดยฟังก์ชัน renderRoot()
โดยเมื่อดูรายละเอียดเพิ่มเติมใน source code ของ renderRoot() ใน core/lib/Drupal/Core/Render/Renderer.php จะพบว่ามีการใช้งาน array form เป็น input โดยตัวแปรที่รับเข้าไว้คือ $elements จากนั้นจึงส่งต่อไปยัง render()
จาก render() จะทำการส่งต่อไปยัง doRender()
ภายใน function doRender() จะตรวจสอบ $elements (หรือก็คือ $form) ว่ามี key ที่ชื่อว่า #post_render หรือไม่ หากมี, ค่า value ของ key #post_render จะถูกนำไปใช้ใน function call_user_func() ที่ตัวแปร $callable เป็นค่าเข้า function แรก (argument#1) และใช้ค่า value ของ key #children เป็นค่าเข้า function ที่ 2 และสุดท้ายคือส่งค่า $elements ทั้งก้อนเป็นค่าเข้า function ที่ 3
ทีนี้หากเราย้อนกลับไป request ตอนแรกที่เราส่งไป จะพบว่าเราสามารกำหนดได้ทั้ง #post_render, $callable, value ของ #children ซึ่งนำค่าของทั้ง 3 ส่วนมารวมด้วยกันจะได้ผลออกมาเป็น
โดย call_user_func จะเป็น function ที่เป็นการเรียก function ใดๆก็ได้โดยดูจาก input ของ argument#1, และ argument#2 จะเป็น input ของ function argument#1 อีกทีครับ ทำให้ผลลัพธ์ออกมาเป็นผู้โจมตีจะเรียกใช้งาน function exec และมีการใช้งาน pwd เป็น input ของ fucntion นั่นเอง
exec(“pwd”)
โดยเมื่อดูรายละเอียดเพิ่มเติมใน source code ของ renderRoot() ใน core/lib/Drupal/Core/Render/Renderer.php จะพบว่ามีการใช้งาน array form เป็น input โดยตัวแปรที่รับเข้าไว้คือ $elements จากนั้นจึงส่งต่อไปยัง render()
จาก render() จะทำการส่งต่อไปยัง doRender()
ภายใน function doRender() จะตรวจสอบ $elements (หรือก็คือ $form) ว่ามี key ที่ชื่อว่า #post_render หรือไม่ หากมี, ค่า value ของ key #post_render จะถูกนำไปใช้ใน function call_user_func() ที่ตัวแปร $callable เป็นค่าเข้า function แรก (argument#1) และใช้ค่า value ของ key #children เป็นค่าเข้า function ที่ 2 และสุดท้ายคือส่งค่า $elements ทั้งก้อนเป็นค่าเข้า function ที่ 3
ทีนี้หากเราย้อนกลับไป request ตอนแรกที่เราส่งไป จะพบว่าเราสามารกำหนดได้ทั้ง #post_render, $callable, value ของ #children ซึ่งนำค่าของทั้ง 3 ส่วนมารวมด้วยกันจะได้ผลออกมาเป็น
โดย call_user_func จะเป็น function ที่เป็นการเรียก function ใดๆก็ได้โดยดูจาก input ของ argument#1, และ argument#2 จะเป็น input ของ function argument#1 อีกทีครับ ทำให้ผลลัพธ์ออกมาเป็นผู้โจมตีจะเรียกใช้งาน function exec และมีการใช้งาน pwd เป็น input ของ fucntion นั่นเอง
exec(“pwd”)
CVE-2018-11776
CVE-2018-11776 เป็นช่องโหว่ใน Apache Struts version 2.3 - 2.3.34 และ 2.5 - 2.5.16 โดยเกิดจากที่ไม่มีการตรวจสอบ Object-Graph Navigation Language (OGNL) expressions ซึ่งเป็น Java objects ทำให้เกิด Server Side Template Injection (SSTI) ซึ่งนำไปสู่ Remote Code Execution ได้.
CVE-2018-16509
โดยปกติแล้วเมื่อเรามีการใช้งานคำสั่ง convert ใน Linux อย่าง Ubuntu 16.04, CentOS6 จะเป็นการเรียกใช้งาน Artifex Ghostscript ซึ่งเป็น lib ที่ใช้สำหรับการจัดการภาพ ซึ่ง Artifex ที่เป็น vesrion < 9.24 จะมีการเช็คส่วน /invalidaccess ผิดพลาด ทำให้เกิด Command Injection ได้
CVE-2018-17246
CVE-2018-17246 เป็นช่องโหว่ Local File Inclusion (LFI) โดย Kibana เป็น open source ที่ใช้ทำ analytics และเป็น dashboard search ของ Elasticsearch. โดยช่องโหว่ดังกล่าวกระทบใน Kibana version < 6.4.3 และ Kibana version < 5.6.13
Comments
Post a Comment