代码审计环境篇

在我学习代码审计时,老是版本不对,少了依赖。为了捋清楚这个,决定按Java代码审计(入门篇)来配置一下环境,属于傻瓜式教学。

win10虚拟机

看这篇教程:https://blog.csdn.net/lvlheike/article/details/120398259

1.打开VMware16,点击创建新的虚拟机

image-20240816225505769

2.默认即可

image-20240816225602034

  1. 等等用iso

image-20240816225811872

4.选择对应的版本

image-20240816231116917

  1. 别放C盘

image-20240816232119177

6.BIOS即可

image-20240816232242144

7.看自己配置给,设备管理器看一下就行

image-20240816232446587

8.设置内存,我这里给4G

image-20240816234107549

9.网络选NAT即可

image-20240816234051389

10.IO控制器,默认即可

image-20240816234131760

11.储蓄协议选SCSI

image-20240816234221413

12.创建一个新的磁盘

image-20240816234255365

13.磁盘尽量给大一点,单个文件初期方便管理,我这里只是做代码审计的环境,就不多给了,用建议大小就是了

image-20240816234358227

14.默认即可,下一步

image-20240816234447671

15.自定义硬件,删去不用的打印机,然后在CD里选择刚刚下载的镜像

image-20240816234547392

image-20240816234621970

到这里基本就准备好了,下面进入系统的配置

16.选择好语言下一步

image-20240816234731956

17.现在安装

image-20240816234753329

18.密钥我不推荐在这里写,除非你的密钥百分百没有问题。所以我这里先跳过,选择没有产品密钥,等等自己破解

image-20240816234921397

19.选择自己想要的版本,然后下一步。

image-20240816235144208

20.选择自定义安装。

image-20240816235237184

21.选择磁盘,然后下一步。

image-20240816235315779

22.等待安装即可,这里时间会有点长。

image-20240816235812779

23.按正常思路选即可,就不截图了,如果有特别需要再截出来

image-20240817000029323

image-20240817000413150

这里看自己的想法,不想添加也可以

image-20240817000457603

image-20240817000701263

image-20240817000724230

image-20240817000803476

image-20240817000855084

image-20240817000908381

image-20240817001118883

现在来安装vmtools,不然移动文件什么的太难受了

image-20240817001250392

image-20240817001408291

在分辨率自动调整好后,重启虚拟机,然后破解一下即可

先断开网络,转到设置>系统>关于>更改产品密钥或升级。

image-20240817001813420

image-20240817001703953

输入Windows 10 Pro通用的专业密钥。(这是不会激活的合法密钥,家庭升级专业版用)
VK7JG-NPHTM-C97JM-9MPGT-3V66T

image-20240817001851872

image-20240817001859201

等待即可

image-20240817001935223

出现这种问题,我们还有另一种方法,命令行操作,这里不懂为什么不行

  1. 首先,以管理员身份进入cmd命令行

image-20240817002057908

2.输入命令slmgr /ipk W269N-WFGWX-YVC9B-4J6C9-T83GX !!!
注意,这里一定要等到弹窗出现(弹窗有时候需要等一会儿再出现),
点击确定之后,才能进行下一步操作

image-20240817002114727

  1. 输入命令slmgr /skms kms.loli.best !!!注意,这里一定要等到弹窗出现(弹窗有时候需要等一会儿再出现),点击确定之后,才能进行下一步操作

image-20240817002340199

  1. 输入命令slmgr /ato,弹出弹窗成功激活即激活成功!

image-20240817002426666

image-20240817002451884

到这里就彻底结束了

java环境配置

https://www.oracle.com/java/technologies/javase/javase8-archive-downloads.html

这里用java8u202的版本测试,估计之后还要切别的版本

image-20240817005929498

下载后移动到虚拟机里,刚装的机子就是干净

image-20240817010506915

启动安装,一直下一步就好,虚拟机就一个盘,没什么讲究

image-20240817010530454

image-20240817010709966

安装好了,下面就是配置环境变量

image-20240817113442770

自动安装的话,会给我们自己配一个环境变量,我们最好重新配一个JRE 与 JDK的区别,jre比jdk更轻,提供给仅仅是想运行java程序的人,没有开发的环境那么

在系统变量中新建一个名为“JAVA_HOME”的变量,且变量值为刚才安装 JDK 时所保存的路径,此处为“ C:\Program Files\Java\jdk1.8.0_202,这里最后有没有\好像是有区别的,如果配错了,这也是一个排查点

image-20240817113720721

在系统变量中单击“Path”,再单击“编辑”按钮,在弹出的对话框中添加变量值“;%JAVA_HOME%\bin;%Java_HOME%\jre\bin”,然后单击
“确定”按钮。

image-20240817114842696

在系统变量中新建一个名为“CLASSPATH”的变量,其变量值为“.;%Java_HOME%\lib;%JAVA_HOME%\lib\tools.jar” 全安装java之后,找不到tools.jar和dt.jar

image-20240817115154285

最后运行可能出现的问题

java -version可以javac不是内部命令

image-20240817120554922

其实就是cmd启动的时候javac的环境还没配置好,没读取到,重新启动下cmd好像就可以,但中间也做了下修改

image-20240817121359346

别以到最顶上,不然path可能会变成一行那种,不是很好看,最好让system32在最头上

image-20240817121330877

可以关机打个快照,但为了节省内存,我这里就没打了。

win10-Docker

安装docker主要是为了拉取不同的漏洞环境,用docker拉去比较方便https://www.docker.com/products/docker-desktop/

image-20240817122108960

但这里安的虚拟机版本不够,不是pro或企业版,我服了,反正是为了调试,kali之前安过了,这里就不安了。。。

https://blog.csdn.net/weixin_44818729/article/details/105747134,推荐一个解决方案,除了升级windows外,跳过这这个,来安装JETbrain把

IDEA

image-20240817131605487

至于pycharm和phpstorm就不在虚拟机里装了,外面的python环境和php环境还是容易一点的 ,其实是不想再装了。。。

破解一下

image-20240817134441908

远程调试测试

https://segmentfault.com/a/1190000040469952

对 Jar 包进行远程调试

以冰蝎3.0为例

创建一个空项目即可,然后配置下项目结构

image-20240817145146245

创建一个 lib 文件夹将 Jar 包放入。选中 lib 文件夹后,右键选择“Add as Library…”,将 lib 文件夹添加进项目依赖。成功添加后可以看到 Jar 包中反编译后的源代码。

image-20240817145411230

image-20240817145503779

通过右上角的“Add Configurations”,并单击“+”来添加一个“Remote”。默认配置界面如图 2-36 示,单击“Apply”提交并保存即可。其中
“-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005”将作为运行时的启动参数。 基本上就是默认即可

image-20240817145733682

将“-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:{子配置项}

而子配置项,包括:

  1. transport:数据交换方式,可选:dt_socketdt_shmem,分别代表 socket 网络通信和共享内存通信
  2. Address:标识一个对端的地址,格式为:{ip}:{port}
  3. server:标识自己是调试者还是被调试者,调试者配置为:n,被调试着配置为:y
  4. suspend:只有被调试者才需要配这个参数,当配置为 y 的时候,代表等待调试者连接上来才真正启动 Java 应用;配置为 n 时,则直接启动 Java 应用。

这里的 Java 应用,是相对于 JVM 来说的,假如把 JVM 看成一个平台,那我们写的代码就是一个 Java 应用。JVM 已经启动,但我们的应用代码还没有跑起来,这种情况在上文的语境中,我们叫做 Java 应用还没启动。

配置示例:

  1. 被调试者开启远程调试监听:

    -agentlib:jdwp=transport=dt_socket,address=localhost:7007,server=y,suspend=y
  2. 被调试者开启本地共享内存调试监听:

    -agentlib:jdwp=transport=dt_shmem,server=y,suspend=n
  3. 调试者远程连接被调试者:

    -agentlib:jdwp=transport=dt_socket,address=localhost:7007,server=n,suspend=y
  4. 调试者基于共享内存方式连接被调试者:

    -agentlib:jdwp=transport=dt_shmem, address=<mysharedmem>
  5. 调试者基于共享内存方式启动被调试者:

    -agentlib:jdwp=transport=dt_shmem,server=y,onuncaught=y,launch=d:\bin\debugstub.exe

被调试者基于共享内存的监听启动后,共享内存地址将会打印到控制台上。调试者配置时需要配置这个共享内存的地址

image-20240817151422886

单击 IntelliJ IDEA 右上角的 Debug 按钮,即可发现程序在断点处暂停,然后就可以进行逐步的调试了

image-20240817152419041

对 Weblogic 进行远程调试

这次试试在不同虚拟机里测试一下,进入/weblogic/CVE-2017-10271 文件夹,修改其中的 docker-compose.yml 文件,将 8453 端口打开

image-20240817152713534

使用 docker-compose 命令

docker-compose up -d 

编译镜像并启动容器。容器成功启动,开启 8453 端口并且映射到本机 ,可以用

docker ps -a

查看是否启动成功

image-20240817154100250

使用(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"
export debugFlag

image-20240817155453094

使用 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
ls
apt-get install zip
zip -r modules
zip -r wlserver_10.3.zip
ls
docker

image-20240817160250090

将该文件移动至一个项目文件中,并使用 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

image-20240817161307116

解压的时候文件名太长可以下个7zip之类的阶压缩软件,解压完后直接右键在idea打开

image-20240817162535174

添加依赖时,如果不能加,可能时项目结构没配置,jdk索引没建立好,等一会就行,添加好后,配置远程调试

image-20240817162942602

因为是在另一台虚拟机,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,同时查看程序在断点处停

image-20240817163455646

这里好像是因为docker镜像起得debug绑定的是本地ip,所以我们去连是连不到的,里面是ping的通外面,但我们在win10是ping不到容器里面的,但反弹shell有时候又弹的回来,我也搞不懂为什么。所以我这里换一个试试,在kali里启动冰蝎,然后用上面的指令

image-20240817231119504

在kali中执行命令

java -jar -agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5005 Behinder.jar

image-20240817233104480

不能在只有behinder.jar的环境下启动,要在环境全的时候执行,也就是正常启动冰蝎的目录

image-20240817233416946

可以试着调试几步

image-20240817233529597

可以看到这边已经弹窗了

image-20240817233548611

然后中间找了篇文章https://blog.csdn.net/allinallp/article/details/117747427,确实要再配置一下JPDA,先用weblogic照着样子试试,先修改下yml文件(中间调着调着蓝屏重启了)

version: '2'
services:
weblogic:
image: vulhub/weblogic:10.3.6.0-2017
ports:
- "7001:7001"
- "8453:8453"
environment:
TZ: Asia/Shanghai
JPDA_ADDRESS: 8453
JPDA_TRANSPORT: dt_socket
command: ["startWebLogic.sh","jpda", "run"]

注意好缩进,改好了再docker-compose up -d,再回到win10里试试。如果不行,就按他的tomcat试试,不行,这个配置脚本不一样,还是要根据具体脚本改,在里面看不太好看,cp出来把

image-20240818003143055

改下这个位置试试,然后再加上ip,但按我的理解来看,这只是把debug绑在了容器里的端口,无法让别的网段的访问,两台机子都不可达,感觉怎么改都没用,但服务又是可以访问的,不懂为什么,应该就是要docker network改一下,但不会。。因该就是怎么改都没用,不可达docker的网络,得在ping的通情况下改。

创建网络

docker network create \
--driver bridge \
--subnet=192.168.174.0/24 \
--gateway=192.168.174.2 \
--ip-range=192.168.174.100/29 \
my_network

连接网络

sudo docker network connect my_network container_name_or_id

无法访问目标主机,算了先跳过把