基础配置
$ ip a s # 查看网络IP地址,本例中查看到的是192.168.88.40
$ sudo systemctl start ssh # 启ssh服务,弹出的窗口输入密码kali
$ sudo systemctl enable ssh # 设置ssh服务开机自启
[root@myhost ~]# ssh kali@192.168.88.40
nmap扫描
一般来说扫描是攻击的前奏。
扫描可以识别目标对象是什么系统,开放了哪些服务。
获知具体的服务软件及其版本号,可以使得攻击的成功率大大提升。
扫描可以检测潜在的风险,也可以寻找攻击目标、收集信息、找到漏洞
windows下,扫描可以使用xscan / superscan
Linux,扫描可以采用nmap
吾爱破解:https://www.52pojie.cn/
中国黑客团队论坛:https://www.cnhackteam.org/
俄罗斯论坛:https://rutracker.org/
nmap
-sT: TCP扫描。
-U: 扫描目标的UDP端口。
-sP:ping扫描
-A:对目标系统全面分析
扫描整个网段,哪机器可以ping通
┌──(kali㉿kali)-[~]
└─$ nmap -sP 192.168.88.0/24
扫描192.168.88.100开放了哪些TCP端口
┌──(kali㉿kali)-[~]
└─$ sudo nmap -sT 192.168.88.100
扫描192.168.88.100开放了哪些UDP端口。非常耗时!
┌──(kali㉿kali)-[~]
└─$ sudo nmap -sU 192.168.88.100
全面扫描192.168.88.100系统信息
┌──(kali㉿kali)-[~]
└─$ sudo nmap -A 192.168.88.100
使用脚本扫描
在kali主机上查看有哪些脚本
┌──(kali㉿kali)-[~]
└─$ ls /usr/share/nmap/scripts/
扫描ftp服务是否支持匿名访问。ftp控制连接端口号是21
┌──(kali㉿kali)-[~]
└─$ sudo nmap --script=ftp-anon.nse 192.168.88.100 -p 21
21/tcp open ftp
| ftp-anon: Anonymous FTP login allowed # 允许匿名访问
扫描ftp相关信息,如版本号、带宽限制等
┌──(kali㉿kali)-[~]
└─$ sudo nmap --script=ftp-syst.nse 192.168.88.100 -p 21
扫描ftp后门漏洞
┌──(kali㉿kali)-[~]
└─$ sudo nmap --script=ftp-vsftpd-backdoor 192.168.88.100 -p 21
passwd --stdin 用户名 <<< 密码
扫描口令
穷举法 字典法
通过ssh协议,使用nmap自带的密码本扫描远程主机的用户名和密码
在目标主机上创建名为admin的用户,密码为123456
[root@web1 ~]# useradd admin
[root@web1 ~]# echo 123456 | passwd --stdin admin
在kali上扫描弱密码
┌──(kali㉿kali)-[~]
└─$ sudo nmap --script=ssh-brute.nse 192.168.88.100 -p 22
使用字典法 寻找密码
通过ssh协议,使用nmap以及自己的密码本扫描远程主机的密码
1. 创建用户名文件
┌──(kali㉿kali)-[~]
└─$ sudo echo root > /tmp/users.txt
┌──(kali㉿kali)-[~]
└─$ cat /tmp/users.txt
root
2. 生成1990-01-01到2020-12-31之间的所月日期
┌──(kali㉿kali)-[~]
└─$ vim mydate.py
from datetime import datetime, timedelta
d1 = datetime(1989, 12, 31)
d2 = datetime(2021, 1, 1)
dt = timedelta(days=1)
with open('/tmp/mima.txt', 'w') as f:
while d1 < d2:
d1 += dt
f.write("%s\n" % d1.strftime('%Y%m%d'))
┌──(kali㉿kali)-[~]
└─$ python3 mydate.py
3. 修改web1的密码
[root@web1 ~]# echo 19910101 | passwd --stdin root
4. 使用自己的密码本破解密码
┌──(kali㉿kali)-[~]
└─$ sudo nmap --script=ssh-brute.nse --script-args userdb=/tmp/users.txt,passdb=/tmp/mima.txt 192.168.88.100 -p 22
5. 目标主机将会记录所有的登陆事件
[root@web1 ~]# vim /var/log/secure
查看最近的登陆失败事件
[root@web1 ~]# lastb
查看最近的登陆成功事件
[root@web1 ~]# last
防护 方式 封对方的IP 锁定对方破解密码的用户
扫描windows口令
[root@myhost ~]# cat /tmp/winuser.txt # windows用户名
administrator
admin
通过samba服务扫描密码
[root@myhost ~]# nmap --script=smb-brute.nse --script-args userdb=/tmp/winuser.txt,passdb=/tmp/mima 172.40.0.151
使用john破解密码
在线破解哈希值的网站:https://cmd5.com/
哈希是算法,英文hash的音译,包括md5、sha等
哈希算法是一种单向加密的算法,也就是将原始数据生成一串“乱码”
只能通过原始数据,生成这串“乱码”,但是不能通过“乱码”回推出原始数据
相同的原始数据,生成的乱码是相同的。
kali系统提供了一个名为john的工具,可用于密码破解
字典暴力破解,密码本是/usr/share/john/password.lst
┌──(kali㉿kali)-[~]
└─$ sudo john shadow
直接显示破解的密码,不显示其他额外信息
┌──(kali㉿kali)-[~]
└─$ sudo john --show shadow
root:123456:18912:0:99999:7:::
tom:abc123:18912:0:99999:7:::
jerry:123123:18912:0:99999:7:::
字典暴力破解,指定密码本文件
┌──(kali㉿kali)-[~]
└─$ sudo john --wordlist=/tmp/mima.txt shadow
john + 密码本 来破解
抓包
封装与解封装
以太网数据帧结构
MAC地址:分为目标和源MAC地址,6字节
Type:类型,说明数据帧中包含的数据类型
Data:高层数据
FCS:帧校验序列
网络层数据包结构
版本:协议版本,如IPv4
生存时间:8位,初始一个值n,每经过一个路由器减1,直到为0丢弃,目的为防止分组在网络上无限传播下去
协议号:数据部分应交付的协议号,如TCP是6,UDP是17
TCP头部结构
源端口:数据段的源端口,一般为大于1024的随机值
目标端口:数据段的目标端口
序号:在一个TCP连接中传输的数据段都按顺序编号
UDP头部结构
源端口:数据段的源端口,一般为大于1024的随机值
目标端口:数据段的目标端口
实施抓包
传输的各种数据,在网络中都是一个个的数据包
$ sudo tcpdump
-i:指定抓取哪块网卡进入的数据包
-A:转换为ASCII码,使得可读
-w:抓包写入文件
-r:从文件中读取抓包信息
抓包时可以过滤要抓哪些包
使用host过滤主机,使用net过滤网段,使用port过滤端口... ...
1. 抓包:抓取eth0上进出的、与192.168.88.100有关的、涉及TCP21端口的数据包。以下命令执行后,打开新终端。
┌──(kali㉿kali)-[~]
└─$ sudo tcpdump -i eth0 -A host 192.168.88.100 and tcp port 21
2. 在新终端登陆ftp
┌──(kali㉿kali)-[~]
└─$ ftp 192.168.88.100
Connected to 192.168.88.100.
220 (vsFTPd 3.0.2)
Name (192.168.88.11:kali): tom # 用户名
331 Please specify the password.
Password:abc123 # 此处是tom的密码
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> exit # 退出
221 Goodbye.
3.在tcpdump终端可以看到明文的用户名和密码
保存抓包文件
1. 将抓到的包存入文件ftp.cap
┌──(kali㉿kali)-[~]
└─$ sudo tcpdump -i eth0 -A -w ftp.cap host 192.168.88.100 and tcp port 21
2. 在另一个终端访问ftp
在新终端登陆ftp
┌──(kali㉿kali)-[~]
└─$ ftp 192.168.88.100
Connected to 192.168.88.100.
220 (vsFTPd 3.0.2)
Name (192.168.88.11:kali): tom # 用户名
331 Please specify the password.
Password:abc123 # 此处是tom的密码
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> exit # 退出
221 Goodbye.
3. 在抓包终端ctrl+c停止
4. 读取抓到的包,并过滤
┌──(kali㉿kali)-[~]
└─$ tcpdump -A -r ftp.cap | egrep 'USER|PASS'
图形工具:wireshark
yum install wireshark ftp
选择抓哪块网卡进出的数据,然后点左上角的开始
抓到包后,点击左上角同样位置停止,查看数据
安全加固
nginx安全
安装启服务
yum install -y nginx
systemctl enable nginx --now
命令行访问不存在的路径:
curl -I http://192.168.88.100/
HTTP/1.1 200 OK
Server: nginx/1.14.1 # 版本号
隐藏版本信息
vim /etc/nginx/nginx.conf
... ...
17 http {
18 server_tokens off;
... ...
systemctl restart nginx.service
再次访问不存在的路径,版本号消失
curl -I http://192.168.88.100/
HTTP/1.1 200 OK
Server: nginx # 没有版本号了
防止DOS、DDOS攻击
DDOS:分布式拒绝服务
配置nginx连接共享内存为10M,每秒钟只接收一个请求,最多有5个请求排队,多余的拒绝
vim /etc/nginx/nginx.conf
17 http {
18 limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s; # 添加
... ...
40 server {
41 listen 80 default_server;
42 listen [::]:80 default_server;
43 server_name _;
44 root /usr/share/nginx/html;
45 limit_req zone=one burst=5; # 添加
[root@web1 ~]# systemctl restart nginx.service
再次测试
就会失败一些
防止缓冲区溢出
缓冲区溢出定义:程序企图在预分配的缓冲区之外写数据。
漏洞危害:用于更改程序执行流,控制函数返回值,执行任意代码。
vim /etc/nginx/nginx.conf
... ...
17 http {
18 client_body_buffer_size 1k;
19 client_header_buffer_size 1k;
20 client_max_body_size 1k;
21 large_client_header_buffers 2 1k;
Linux加固
设置tom账号,有效期为2022-1-1
chage -l tom
最近一次密码修改时间 :10月 12, 2021
密码过期时间 :从不
密码失效时间 :从不
帐户过期时间 :从不
两次改变密码之间相距的最小天数 :0
两次改变密码之间相距的最大天数 :99999
在密码过期之前警告的天数 :7
chage -E 2022-1-1 tom
chage -l tom
chage -m 1 -M 90 -W 7 -I 15 -E 2025-2-1 tom
-m 两次改变密码之间相距的最小天数
-M 两次改变密码之间相距的最大天数
-W 在密码过期之前警告的天数
-I 密码失效时间
-E 帐户过期时间
最近一次密码修改时间 :10月 12, 2021
密码过期时间 :从不
密码失效时间 :从不
帐户过期时间 :1月 01, 2022
两次改变密码之间相距的最小天数 :0
两次改变密码之间相距的最大天数 :99999
在密码过期之前警告的天数 :7
设置账号永不过期,注意-E后面是数字-1,不是字母l
chage -E -1 tom
chage -l tom
最近一次密码修改时间 :10月 12, 2021
密码过期时间 :从不
密码失效时间 :从不
帐户过期时间 :从不
两次改变密码之间相距的最小天数 :0
两次改变密码之间相距的最大天数 :99999
在密码过期之前警告的天数 :7
设置新建用户的密码策略
[root@web1 ~]# vim /etc/login.defs
39 PASS_MAX_DAYS 99999 # 密码永不过期,设置最长有效期
40 PASS_MIN_DAYS 0 # 密码最短使用时间,0表示随时可改密码
41 PASS_MIN_LEN 5 # 密码最短长度
42 PASS_WARN_AGE 7 # 密码过期前7天发警告
47 UID_MIN 1000 # 新建用户最小的UID
48 UID_MAX 60000 # 新建用户最大的UID
不会对现有用户生效的 对新建后的账号才会改变
用户安全设置
锁定tom账号
[root@web1 ~]# passwd -l tom
锁定用户 tom 的密码 。
passwd: 操作成功
[root@web1 ~]# passwd -S tom # 查看状态
tom LK 2021-10-12 0 99999 7 -1 (密码已被锁定。)
解锁tom账号
[root@web1 ~]# passwd -u tom
解锁用户 tom 的密码。
passwd: 操作成功
[root@web1 ~]# passwd -S tom
tom PS 2021-10-12 0 99999 7 -1 (密码已设置,使用 SHA512 算法。)
保护文件
会有一个备份文件如果吴删除的话 文件名- 就是备份
查看文件的特殊属性
[root@web1 ~]# lsattr /etc/passwd
---------------- /etc/passwd # 没有特殊属性
修改属性
chattr +i 文件 # 不允许对文件做任何操作,只能看
chattr -i 文件 # 去除i属性
chattr +a 文件 # 文件只允许追加
chattr -a 文件 # 去除a属性
[root@web1 ~]# chattr +i /etc/passwd
[root@web1 ~]# lsattr /etc/passwd
----i----------- /etc/passwd
[root@web1 ~]# useradd zhangsan
useradd:无法打开 /etc/passwd
[root@web1 ~]# rm -f /etc/passwd
rm: 无法删除"/etc/passwd": 不允许的操作
[root@web1 ~]# chattr -i /etc/passwd
[root@web1 ~]# rm -f /etc/passwd # 可以删除
[root@web1 ~]# ls /etc/passwd
ls: 无法访问/etc/passwd: 没有那个文件或目录
恢复passwd文件
[root@web1 ~]# cp /etc/passwd- /etc/passwd
追加
[root@web1 ~]# chattr +a /etc/hosts
[root@web1 ~]# echo 'hello world' >> /etc/hosts
[root@web1 ~]# rm -f /etc/hosts
rm: 无法删除"/etc/hosts": 不允许的操作