从0.1开始的代码审计
代码审计环境篇
在我学习代码审计时,老是版本不对,少了依赖。为了捋清楚这个,决定按Java代码审计(入门篇)来配置一下环境,属于傻瓜式教学。
win10虚拟机
看这篇教程:https://blog.csdn.net/lvlheike/article/details/120398259
1.打开VMware16,点击创建新的虚拟机
2.默认即可
- 等等用iso
4.选择对应的版本
- 别放C盘
6.BIOS即可
7.看自己配置给,设备管理器看一下就行
8.设置内存,我这里给4G
9.网络选NAT即可
10.IO控制器,默认即可
11.储蓄协议选SCSI
12.创建一个新的磁盘
13.磁盘尽量给大一点,单个文件初期方便管理,我这里只是做代码审计的环境,就不多给了,用建议大小就是了
14.默认即可,下一步
15.自定义硬件,删去不用的打印机,然后在CD里选择刚刚下载的镜像
到这里基本就准备好了,下面进入系统的配置
16.选择好语言下一步
17.现在安装
18.密钥我不推荐在这里写,除非你的密钥百分百没有问题。所以我这里先跳过,选择没有产品密钥,等等自己破解
19.选择自己想要的版本,然后下一步。
20.选择自定义安装。
21.选择磁盘,然后下一步。
22.等待安装即可,这里时间会有点长。
23.按正常思路选即可,就不截图了,如果有特别需要再截出来
这里看自己的想法,不想添加也可以
现在来安装vmtools,不然移动文件什么的太难受了
在分辨率自动调整好后,重启虚拟机,然后破解一下即可
先断开网络,转到设置>系统>关于>更改产品密钥或升级。
输入Windows 10 Pro通用的专业密钥。(这是不会激活的合法密钥,家庭升级专业版用)
VK7JG-NPHTM-C97JM-9MPGT-3V66T
等待即可
出现这种问题,我们还有另一种方法,命令行操作,这里不懂为什么不行
- 首先,以管理员身份进入cmd命令行
2.输入命令slmgr /ipk W269N-WFGWX-YVC9B-4J6C9-T83GX !!!
注意,这里一定要等到弹窗出现(弹窗有时候需要等一会儿再出现),
点击确定之后,才能进行下一步操作
- 输入命令slmgr /skms kms.loli.best !!!注意,这里一定要等到弹窗出现(弹窗有时候需要等一会儿再出现),点击确定之后,才能进行下一步操作
- 输入命令slmgr /ato,弹出弹窗成功激活即激活成功!
到这里就彻底结束了
java环境配置
https://www.oracle.com/java/technologies/javase/javase8-archive-downloads.html
这里用java8u202的版本测试,估计之后还要切别的版本
下载后移动到虚拟机里,刚装的机子就是干净
启动安装,一直下一步就好,虚拟机就一个盘,没什么讲究
安装好了,下面就是配置环境变量
自动安装的话,会给我们自己配一个环境变量,我们最好重新配一个JRE 与 JDK的区别,jre比jdk更轻,提供给仅仅是想运行java程序的人,没有开发的环境那么
在系统变量中新建一个名为“JAVA_HOME”的变量,且变量值为刚才安装 JDK 时所保存的路径,此处为“ C:\Program Files\Java\jdk1.8.0_202,这里最后有没有\好像是有区别的,如果配错了,这也是一个排查点
在系统变量中单击“Path”,再单击“编辑”按钮,在弹出的对话框中添加变量值“;%JAVA_HOME%\bin;%Java_HOME%\jre\bin”,然后单击
“确定”按钮。
在系统变量中新建一个名为“CLASSPATH”的变量,其变量值为“.;%Java_HOME%\lib;%JAVA_HOME%\lib\tools.jar” 全安装java之后,找不到tools.jar和dt.jar
最后运行可能出现的问题
java -version可以javac不是内部命令
其实就是cmd启动的时候javac的环境还没配置好,没读取到,重新启动下cmd好像就可以,但中间也做了下修改
别以到最顶上,不然path可能会变成一行那种,不是很好看,最好让system32在最头上
可以关机打个快照,但为了节省内存,我这里就没打了。
win10-Docker
安装docker主要是为了拉取不同的漏洞环境,用docker拉去比较方便https://www.docker.com/products/docker-desktop/
但这里安的虚拟机版本不够,不是pro或企业版,我服了,反正是为了调试,kali之前安过了,这里就不安了。。。
IDEA
至于pycharm和phpstorm就不在虚拟机里装了,外面的python环境和php环境还是容易一点的 ,其实是不想再装了。。。
破解一下
远程调试测试
https://segmentfault.com/a/1190000040469952
对 Jar 包进行远程调试
以冰蝎3.0为例
创建一个空项目即可,然后配置下项目结构
创建一个 lib 文件夹将 Jar 包放入。选中 lib 文件夹后,右键选择“Add as Library…”,将 lib 文件夹添加进项目依赖。成功添加后可以看到 Jar 包中反编译后的源代码。
通过右上角的“Add Configurations”,并单击“+”来添加一个“Remote”。默认配置界面如图 2-36 示,单击“Apply”提交并保存即可。其中
“-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005”将作为运行时的启动参数。 基本上就是默认即可
将“-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005”作为启动参数运行 Jar 包,如图 2-37 所示。 suspend 表示是否暂停程序等待调试器的连接,“y”表示暂停, “n”表示不暂停。建议选择暂停,避免程序执行过快导致一些断点无法拦截程序
java -jar -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 Behinder.jar |
调试器和被调试 JVM 在启动的时候, 都需要通过设置 JVM 参数来让它具有调试的能力或者可被调试的能力。
对于 JDK5 及以上的版本,参数格式为:-agentlib:jdwp={子配置项}
对于 JDK5 以前的版本,参数格式为:-Xdebug
以及 -Xrunjdwp:{子配置项}
。
而子配置项,包括:
- transport:数据交换方式,可选:
dt_socket
和dt_shmem
,分别代表 socket 网络通信和共享内存通信 - Address:标识一个对端的地址,格式为:
{ip}:{port}
- server:标识自己是调试者还是被调试者,调试者配置为:
n
,被调试着配置为:y
- suspend:只有被调试者才需要配这个参数,当配置为
y
的时候,代表等待调试者连接上来才真正启动 Java 应用;配置为n
时,则直接启动 Java 应用。
这里的 Java 应用,是相对于 JVM 来说的,假如把 JVM 看成一个平台,那我们写的代码就是一个 Java 应用。JVM 已经启动,但我们的应用代码还没有跑起来,这种情况在上文的语境中,我们叫做 Java 应用还没启动。
配置示例:
被调试者开启远程调试监听:
-agentlib:jdwp=transport=dt_socket,address=localhost:7007,server=y,suspend=y
被调试者开启本地共享内存调试监听:
-agentlib:jdwp=transport=dt_shmem,server=y,suspend=n
调试者远程连接被调试者:
-agentlib:jdwp=transport=dt_socket,address=localhost:7007,server=n,suspend=y
调试者基于共享内存方式连接被调试者:
-agentlib:jdwp=transport=dt_shmem, address=<mysharedmem>
调试者基于共享内存方式启动被调试者:
-agentlib:jdwp=transport=dt_shmem,server=y,onuncaught=y,launch=d:\bin\debugstub.exe
被调试者基于共享内存的监听启动后,共享内存地址将会打印到控制台上。调试者配置时需要配置这个共享内存的地址
单击 IntelliJ IDEA 右上角的 Debug 按钮,即可发现程序在断点处暂停,然后就可以进行逐步的调试了
对 Weblogic 进行远程调试
这次试试在不同虚拟机里测试一下,进入/weblogic/CVE-2017-10271 文件夹,修改其中的 docker-compose.yml 文件,将 8453 端口打开
使用 docker-compose 命令
docker-compose up -d |
编译镜像并启动容器。容器成功启动,开启 8453 端口并且映射到本机 ,可以用
docker ps -a |
查看是否启动成功
使用(a6就是容器id前2位缩写)
docker exec -it a6 /bin/bash |
命令进入容器,使用 vi 修改文件/root/Oracle/Middleware/user_projects/domains/base_domain/bin/setDomainEnv.sh。 在图 2-41 所示代码段处添加如下两行代码。
ebugFlag="true" |
使用 docker restart 命令重启容器,再进入容器,将/root/Oracle/Middleware 文件夹下的 modules 文件夹和 wlserver_10.3 文件夹使用 zip 命令压缩成 zip 压缩包。容器中是一个简易的 Linux 系统, 需要执行 apt-get install zip 来安装 zip 压缩功能。Windows命令行对路径长度有限制,如果直接使用 docker 的 cp 指令,就会在复制一些长文件
docker exec -it a6 /bin/bash |
将该文件移动至一个项目文件中,并使用 IDEA 打开,如图 2-43 所示,选中w1server_10.3/server/lib 文件和 modules 文件并右键单击,选择“Add as Library…”添加依赖文件。如图 2-44 所示,单击 IDEA 右上角的“Add Configurations”按钮,在弹出的选项框中单击左上角的“+”进行“Add New Configurations”操作。然后在下拉框中找到 Remote 选项并单击,进入图 2-45 所示的配置页面,填写端口号为 8453,注意,需要与第一步在 docker-compose.yml 文件中的填写内容保持一致。填写完毕,单击“Apply”按钮应用配置,再单击“OK”按钮关闭配置页面即可。 (还是要移动下依赖文件,保证远调配置一致),这里我们看下用python起个服务器下载,到win10
python -m http.server 80 |
解压的时候文件名太长可以下个7zip之类的阶压缩软件,解压完后直接右键在idea打开
添加依赖时,如果不能加,可能时项目结构没配置,jdk索引没建立好,等一会就行,添加好后,配置远程调试
因为是在另一台虚拟机,host得改一下然后端口改成刚刚配置yml文件里得8453
在wlserver_10.3/server/lib/weblogic.jar!/weblogic/wsee/jaxws/WLSServletAdapter.class 的 hadle 方法处设置断点, 接着单击右上角的 Debug 按钮(绿色小虫子图标)运行 Debug 模式。然后使用浏览器访问 http://192.168.174.137:7001/wls-wsat/CoordinatorPortType,同时查看程序在断点处停
这里好像是因为docker镜像起得debug绑定的是本地ip,所以我们去连是连不到的,里面是ping的通外面,但我们在win10是ping不到容器里面的,但反弹shell有时候又弹的回来,我也搞不懂为什么。所以我这里换一个试试,在kali里启动冰蝎,然后用上面的指令
在kali中执行命令
java -jar -agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5005 Behinder.jar |
不能在只有behinder.jar的环境下启动,要在环境全的时候执行,也就是正常启动冰蝎的目录
可以试着调试几步
可以看到这边已经弹窗了
version: '2' |
注意好缩进,改好了再docker-compose up -d,再回到win10里试试。如果不行,就按他的tomcat试试,不行,这个配置脚本不一样,还是要根据具体脚本改,在里面看不太好看,cp出来把
改下这个位置试试,然后再加上ip,但按我的理解来看,这只是把debug绑在了容器里的端口,无法让别的网段的访问,两台机子都不可达,感觉怎么改都没用,但服务又是可以访问的,不懂为什么,应该就是要docker network改一下,但不会。。因该就是怎么改都没用,不可达docker的网络,得在ping的通情况下改。
创建网络
docker network create \ |
连接网络
sudo docker network connect my_network container_name_or_id |
无法访问目标主机,算了先跳过把