作者:R17a
本文為作者投稿,Seebug Paper 期待你的分享,凡經采用即有禮品相送!
投稿郵箱:paper@seebug.org
0x00 前言
最近一直在Java相關漏洞進行分析學習,調試環境就是第一步需要準備的,所以總結一下,也是為跟我一樣想要接觸漏洞調試分析的萌新提供一些參考吧。
文筆粗糙,如有不當,請大佬批評指正。
0x01 調試基本方法
調試環境
- Intelli IDEA 2019.2.4
- Windows10
關于IDEA的安裝破解這里就不說了,網上大把文章可以參考。
IDEA的調試基本用法

如上圖,我們挨個簡單介紹下這些按鈕和區域,如果想要更多詳細信息,建議看下官網IntelliJ IDEA Debug code
1.調用棧:主要是在調試過程中的一些方法調用棧的顯示。
2.變量區:調試程序中的變量顯示,可以查看和更改變量值。
3.調試按鈕:
方框內從左到右按鈕分別是:
Step Into (F7),步入,有方法可以進入方法內部,一般用于進入自定義方法內,不會進入官方類庫的方法
Step Over (F8),步過,一步一步往下,有方法不會進入內部。
Step Into (F7),步入,有方法可以進入方法內部,一般用于進入自定義方法內,不會進入官方類庫的方法。
Force Step Into (Alt+Shift+F7),強制步入,能進入任何方法,包括官方類庫的方法。
Step Out (Shift+F8),步出,退出當前方法到方法調用處。
Drop Frame,回退斷點,回退frame。
Run to Cursor (Alt+F9):運行到光標處,可以運行到光標的那行,到那時中途有斷點會停在斷點。
其實除了上面的按鈕,還有Force Run to Cursor(Ctrl+Alt+F9)、Improve stepping speed、Step out of code block?等可以在Run菜單欄找到。
4.運行工具按鈕:可以在這里重新運行、結束、查看所有斷點等。
Rerun,重新運行。
Resume Program (F9):恢復程序,運行程序,遇到斷點再停止。
Stop,停止運行。
View Breakpoints,查看所有斷點。
View Breakpoints,使所有斷點失效。
5.計算表達式:Evaluate Expression (Alt+F8),在我看來是一個非常好用的計算器,可以計算表達式、方法return值等。
除了上面的基本用法,官方還為我們準備了一些實用的技巧。
1.Drop Frame,回退斷點,上面提到了這個。我們在debug分析的過程中經常會有Step多了,錯過了關鍵地方或者想回去重看下,就可以用這個。
2.Use breakpoint expressions?,斷點表達式:可以設置斷點的條件,當滿足條件才暫停,這個可以在循環或者某個確認。

0x02 遠程調試
我在分析漏洞的時候,會用到遠程調試,多是docker+IDEA,所以這里想總結下便于以后遠程分析各種java相關漏洞。
Java遠程調試基礎知識
Java遠程調試的原理是兩個VM之間通過debug協議JDWP(Java Debug Wire Protocol)進行通信,確保本地的Java的源代碼與目標應用程序一致就可以成功調試,在這里我們通常會認為遠程JVM是debug服務器,本地JVM是debug客戶端。
知道這個我們就抓住了重點。IDEA為我們提供了連接遠程調試服務,只要像下圖配置遠程JVM就可以去連接,而且IDEA會幫我們自動生成命令行,可以為遠程JVM提供參考。

Debugger mode:指的是本地的debug模式,這里有兩種選擇Attach和Listen,Attach代表主動去連接遠程JVM,那么遠程JVM就處于監聽狀態,Listen代表本地監聽遠程JVM,我目前接觸的比較多的是Attach模式,所以下面介紹的也都是這種模式。
不同的JDK版本,JVM命令行參數可能不同,這里僅介紹下JDK 5-8的命令行參數:
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=1234
transport=dt_socket:socket方式連接
server=y:yes,監聽debug客戶端請求
suspend=n:no,暫不掛起
address=1234:監聽端口1234
遠程調試實例
在分析漏洞時,經常會在vulhub、vulfocus等拉取docker鏡像來進行復現,但是如果這時候想要進行代碼深入分析的時候,就需要用到遠程調試。以下用兩個例子進行說明。
場景一:Apache Dubbo漏洞docker遠程分析調試,內含jar包。
直接在后臺從vulfocus進行拉取鏡像或者vulfocus頁面拉取:
docker pull vulfocus/dubbo-cve_2020_1948

在頁面啟動dubbo-cve_2020_1948容器。


查看容器相關信息,如圖,能看到環境變量和啟動命令"java -jar /demo/demo.jar"
docker inspect 524

現在我們需要將容器環境變量和啟動命令做修改,這里我使用docker-compose來啟動服務。docker-compose.yml文件如下,添加環境調試變量JAVA_OPT、命令添加"-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=18888",端口注意對于添加18888。
docker-compose.yml
version: "3"
services:
api:
build: .
image: vulfocus/dubbo-cve_2020_1948
environment:
- JAVA_OPTS=-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=18888
container_name: dubbo_test
command:
- java
- -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=18888
- -jar
- /demo/demo.jar
ports:
- "12345:12345"
- "18888:18888"
開啟docker-compose up -d

到此docker環境配置完成,接下來配置本地IDEA環境。
首先用docker cp將上面執行的demo.jar包拷貝出來,然后傳輸到本地。
docker cp 524:/demo/demo.jar .
創建一個新項目,將demo.jar作為libraries加進來。

在項目下創建一個lib目錄,然后打開demo.jar里面的lib下的所有jar拷貝到新建的lib下,并將新建的lib添加到libraries。

然后配置遠程調試JVM信息準備連接。

配置完成后,打上斷點發送包就可以正常攔截分析了。

這種場景適用于直接執行jar包,根據實際情況修改相關信息即可。當我們的復現docker環境是用包含了war包在tomcat下部署的,那我們可以采用兩種方法,一種即將war拷貝到本地部署然后調試,另一種就是修改容器的tomcat相關遠程調試參數然后拷貝ROOT下的src到項目然后分析,這里說明下如何tomcat遠程調試參數:可以直接進入容器修改catalina.sh,也可以像上面方式寫一個docker-compose.yml添加上環境變量。所以類似情況根據實際情況變通即可。
# tomcat遠程調試
CATALINA_OPTS="-Xdebug -Xrunjdwp:transport=dt_socket,address=5005,suspend=n,server=y"
場景二:weblogic漏洞調試分析,直接用docker鏡像進行分析,
將用到的jar拷貝到本地。
這里不在本文詳細說明,參考IDEA+docker,進行遠程漏洞調試(weblogic)即可,我們需要知道的是遇到這種大型中間件等思路都是類似的:
- 找到開啟他們遠程調試的方法,一般是在啟動腳本中某個debug參數進行修改
- 保證外部開啟這個容器的對應端口和對應環境
- 本地IDEA:在一個項目中將容器內的相關jar包都拷貝出來作為libraries
- IDEA配置遠程調試IVM信息,打上斷點連接remote JVM
參考鏈接:
Java遠程調試(Remote Debugging)的那些事
Java Application Remote Debugging
IDEA+docker,進行遠程漏洞調試(weblogic)
本文由 Seebug Paper 發布,如需轉載請注明來源。本文地址:http://www.bjnorthway.com/1316/
暫無評論