NullByte Walkthrough
sqli打点,环境变量劫持提权
Recon
通过
fping定位靶机IP地址nmap进行全端口扫描
通过对主机开放的端口分析进行攻击建模
80/tcp → web渗透
通过
feroxbuster对目录进行扫描,-n告诉工具不进行递归扫描得到了
phpmyadmin、uploads等关键目录111/tcp → rpcbind服务 可能存在nfs未授权
测试无果
777/tcp → 指纹识别为OpenSSH
44970/tcp → rpcbind 用作与rpcbind服务交互
Exif → burp → sqli → shell as ramses
phpmyadmin & uploads
通过对phpmyadmin进行弱口令尝试无果,暂时不开展进一步渗透,认为不存在已知漏洞
而uploads目录下似乎也没有任何内容,暂时不进行递归扫描
main.gif
在目录扫描的结果中除开phpmyadmin与uploads外就只有网站主页显示的main.gif了,根据打靶经验认为直接从phpmyadmin作为跳板渗透的几率很小,那么对main.gif开展一波信息收集
exiftool是一款开源的元数据(Metadata)读写工具
元数据就是“描述数据的数据”,比如一张照片,照片内容主体就是它数据本身,而它的元数据就是拍摄这种照片的相机型号、拍摄地点、拍摄时间等信息。
在Comment注释中发现一串有意思的字符,这串字符可能是一串密文、一串密码、一个路径
crack key
从验证时间复杂度最低的网页路径拼接开始尝试,在该路径下得到一个输入Key的功能点,输入后提交数据会发起一个POST请求
对该参数进行fuzz爆破,得到elite
sqli
访问后得到一个输入用户名进行查找的功能点,双引号报错,开始sql注入
order by判断注入点查询字段数为3,通过union select查询得到当前使用seth数据库,注入点权限为root@localhost,Mysql版本为5.5.44
0" union select database(),user(),version() --
查询seth库中表格,发现只有1个users表
0" union select null,null,group_concat(table_name) from information_schema.tables where table_schema=database() --
查询users表字段名,得到id、user、pass、position
0" union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users' and table_schema=database() --
查询数据,发现有1个有效用户ramses
0" union select id,user,pass from seth.users --
密码看起来像base64,解码得到hash
通过crackstation.net破解得到omega
shell as ramses
使用ramses/omega尝试phpmyadmin登录无果,尝试777端口登录ssh得到用户权限
suid → env hijack → shell as root
find
通过find / -user root -perm -4000 -print 2>/dev/null查找具有suid粘滞位权限的二进制文件
其中/var/www/backup/procwatch很特别,尝试执行发现结果类似ps命令的执行结果
通过scp命令将procwatch文件copy到本地进行分析,需要注意的是与ssh不同,scp指定端口需要使用大写-P参数
程序内容很简单:
创建一个大小为54字节名为
command的字符型变量将
ps字符放入command变量中执行
command变量中的命令
env hijack
此处可以使用的环境变量劫持关乎到环境变量优先级的问题:
环境变量是使用冒号分割的有序目录列表:如/usr/local/bin/:/usr/bin/
在这种情况下假设执行ps命令,那么会先寻找/usr/local/bin/ps,如果不存在则寻找/usr/bin/ps
那么该程序执行的ps命令在默认环境变量时执行的是/bin/ps,一旦篡改环境变量则会执行我写入的恶意./malware/ps'用于生成交互式sh
此时再度执行./watchproc,提权成功
Some thinking
1.为什么在suid提权时无法使用bash?
- 在suid提权时曾发现由带有suid权限的命令派生一个/bin/bash时,这个shell环境将不会继承suid该有的root权限
这是由于bash这样的现代化shell内置了一个安全机制。当它启动时会检查自己的真实用户ID(Real User ID, ruid)和有效用户ID(Effective User ID, euid)
RUID:用于在一个系统中标识一个用户是谁,当用户成功登录时,系统就已经确定了他的唯一RUID
EUID:用于系统决定用户对系统资源的访问权限
在提权的场景中,以普通用户权限ramses执行带有suid权限的二进制文件,这时ruid为ramses。
而procwatch程序有SUID权限且属于root,所以它启动的子进程的euid是root
当Bash检测到ruid和euid不一致时处于安全考虑,它会自动放弃由SUID获得的更高权限(euid=root),将自己的有效用户ID降级回真实用户ID(euid=ramses)。
bypass:/bin/bash -p → privileges进入特权模式,阻止bash自动放弃由SUID获得的特权
2.在真实环境中是否有export命令设置环境变量的条件?
先说结论:绝对有
这涉及到linux系统中外部命令与shell内建命令的内容
外部命令:它们是独立的可执行文件,存在于文件系统的某个目录中,例如
/bin/cat,/bin/ls当执行一个外部命令时,Shell会在
$PATH环境变量指定的目录列表中去查找这个文件,然后创建一个新的子进程(child process)来执行它Shell内建命令(shell builtins):它们不是独立的文件,而是Shell程序本身的一部分它们的实现代码被编译进了Shell的二进制文件(比如/bin/bash)中
当执行一个内建命令时,Shell不会去磁盘上查找文件,也不会创建新的子进程。它会直接在当前Shell进程内部执行相应的功能
如何验证一个命令时内建的?
可以通过type这个内建命令查看一个命令的类型:
1
2
3
4
5
6
ramses@NullByte:~$ type export
export is a shell builtin
ramses@NullByte:~$ type cd
cd is a shell builtin
ramses@NullByte:~$ type ls
ls is aliased to `ls --color=auto'
所以在提权场景中使用export命令来设置环境变量的权限条件一定会有,即使是web打点得到的www-data之类的权限,因为shell的编写也使用到了system函数来创建一个shell,所以不会影响export命令的执行。
.png)



















