高级运维学习(十)系统安全

kali

  • 实际上它就是一个预安装了很多安全工具的Debian Linux

    [root@myhost ~]# kali reset
    kali reset OK.
    该虚拟机系统用户名为:kali,密码为:kali

  • 基础配置

    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 kali@192.168.88.40's password: kali ┌──(kali㉿kali)-[~] └─

nmap扫描

  • 一般来说扫描是攻击的前奏。

  • 扫描可以识别目标对象是什么系统,开放了哪些服务。

  • 获知具体的服务软件及其版本号,可以使得攻击的成功率大大提升。

  • 扫描可以检测潜在的风险,也可以寻找攻击目标、收集信息、找到漏洞

  • windows下,扫描可以使用xscan / superscan

  • Linux,扫描可以采用nmap

  • 吾爱破解:吾爱破解 - LCG - LSG|安卓破解|病毒分析|www.52pojie.cn

  • 中国黑客团队论坛:黑客攻防业务合作 | 7年经验专业团队

  • 俄罗斯论坛:https://rutracker.org/

    ┌──(kali㉿kali)-[~]
    └─$ 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

  • 使用脚本扫描

    通过脚本扫描目标主机的ftp服务

    在目标主机上安装vsftpd服务

    [root@web1 ~]# yum install -y vsftpd
    [root@web1 ~]# vim /etc/vsftpd/vsftpd.conf
    12 anonymous_enable=YES
    [root@web1 ~]# systemctl enable vsftpd --now

    在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

  • 扫描口令

    通过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

  • 扫描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破解密码

  • 在线破解哈希值的网站:md5在线解密破解,md5解密加密

  • 哈希是算法,英文hash的音译,包括md5、sha等

    • 哈希算法是一种单向加密的算法,也就是将原始数据生成一串"乱码"
    • 只能通过原始数据,生成这串"乱码",但是不能通过"乱码"回推出原始数据
    • 相同的原始数据,生成的乱码是相同的。
  • kali系统提供了一个名为john的工具,可用于密码破解

    [root@web1 ~]# echo 123456 | passwd --stdin root
    [root@web1 ~]# useradd tom
    [root@web1 ~]# echo abc123 | passwd --stdin tom
    [root@web1 ~]# useradd jerry
    [root@web1 ~]# echo 123123 | passwd --stdin jerry
    [root@web1 ~]# scp /etc/shadow kali@192.168.88.40:/home/kali/

    字典暴力破解,密码本是/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

抓包

封装与解封装

以太网数据帧结构

  • MAC地址:分为目标和源MAC地址,6字节
  • Type:类型,说明数据帧中包含的数据类型
  • Data:高层数据
  • FCS:帧校验序列

网络层数据包结构

  • 版本:协议版本,如IPv4
  • 生存时间:8位,初始一个值n,每经过一个路由器减1,直到为0丢弃,目的为防止分组在网络上无限传播下去
  • 协议号:数据部分应交付的协议号,如TCP是6,UDP是17

TCP头部结构

  • 源端口:数据段的源端口,一般为大于1024的随机值
  • 目标端口:数据段的目标端口
  • 序号:在一个TCP连接中传输的数据段都按顺序编号

UDP头部结构

  • 源端口:数据段的源端口,一般为大于1024的随机值
  • 目标端口:数据段的目标端口

实施抓包

  • 传输的各种数据,在网络中都是一个个的数据包

    ┌──(kali㉿kali)-[~]
    └─$ 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

    [root@myhost ~]# yum install wireshark ftp

选择抓哪块网卡进出的数据,然后点左上角的开始

抓到包后,点击左上角同样位置停止,查看数据

安全加固

nginx安全

  • 安装启服务

    [root@web1 ~]# yum install -y nginx
    [root@web1 ~]# systemctl enable nginx --now

  • 命令行访问不存在的路径:

    [root@web1 ~]# curl -I http://192.168.88.100/
    HTTP/1.1 200 OK
    Server: nginx/1.14.1 # 版本号
    Date: Mon, 02 Jan 2023 02:54:45 GMT
    Content-Type: text/html
    Content-Length: 3429
    Last-Modified: Thu, 10 Jun 2021 09:09:03 GMT
    Connection: keep-alive
    ETag: "60c1d6af-d65"
    Accept-Ranges: bytes

  • 隐藏版本信息

    [root@web1 ~]# vim /etc/nginx/nginx.conf
    ... ...
    17 http {
    18 server_tokens off;
    ... ...
    [root@web1 ~]# systemctl restart nginx.service

  • 再次访问不存在的路径,版本号消失

    [root@web1 ~]# curl -I http://192.168.88.100/
    HTTP/1.1 200 OK
    Server: nginx # 没有版本号了
    Date: Mon, 02 Jan 2023 02:56:26 GMT
    Content-Type: text/html
    Content-Length: 3429
    Last-Modified: Thu, 10 Jun 2021 09:09:03 GMT
    Connection: keep-alive
    ETag: "60c1d6af-d65"
    Accept-Ranges: bytes

  • 防止DOS、DDOS攻击

  • DDOS:分布式拒绝服务

    压力测试,每批次发送100个请求给web服务器,一共发200个

    [root@myhost ~]# yum install -y httpd-tools
    [root@myhost ~]# ab -c 100 -n 200 http://192.168.88.100/
    ... ...
    Benchmarking 192.168.88.100 (be patient)
    Completed 100 requests
    Completed 200 requests
    Finished 200 requests # 发送200个请求完成
    ... ...
    Complete requests: 200 # 完成了200个请求
    Failed requests: 0 # 0个失败
    ... ...

  • 配置nginx连接共享内存为10M,每秒钟只接收一个请求,最多有5个请求排队,多余的拒绝

    [root@web1 ~]# 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

    再次测试

    [root@myhost ~]# ab -c 100 -n 200 http://192.168.88.100/
    ... ...
    Benchmarking 192.168.88.100 (be patient)
    Completed 100 requests
    Completed 200 requests
    Finished 200 requests
    ... ...
    Complete requests: 200
    Failed requests: 194 # 失败了194个
    ... ...

防止缓冲区溢出

  • 缓冲区溢出定义:程序企图在预分配的缓冲区之外写数据。

  • 漏洞危害:用于更改程序执行流,控制函数返回值,执行任意代码。

    配置nginx缓冲区大小,防止缓冲区溢出

    [root@web1 ~]# 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;
    ... ...
    [root@web1 ~]# systemctl restart nginx.service

Linux加固

  • 设置tom账号,有效期为2022-1-1

    查看tom的账号信息

    [root@web1 ~]# chage -l tom
    最近一次密码修改时间 :10月 12, 2021
    密码过期时间 :从不
    密码失效时间 :从不
    帐户过期时间 :从不
    两次改变密码之间相距的最小天数 :0
    两次改变密码之间相距的最大天数 :99999
    在密码过期之前警告的天数 :7

    [root@web1 ~]# chage -E 2022-1-1 tom
    [root@web1 ~]# chage -l tom
    最近一次密码修改时间 :10月 12, 2021
    密码过期时间 :从不
    密码失效时间 :从不
    帐户过期时间 :1月 01, 2022
    两次改变密码之间相距的最小天数 :0
    两次改变密码之间相距的最大天数 :99999
    在密码过期之前警告的天数 :7

    设置账号永不过期,注意-E后面是数字-1,不是字母l

    [root@web1 ~]# chage -E -1 tom
    [root@web1 ~]# 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": 不允许的操作

相关推荐
Hello.Reader14 小时前
Flink ZooKeeper HA 实战原理、必配项、Kerberos、安全与稳定性调优
安全·zookeeper·flink
执笔论英雄14 小时前
【大模型学习cuda】入们第一个例子-向量和
学习
wdfk_prog14 小时前
[Linux]学习笔记系列 -- [drivers][input]input
linux·笔记·学习
智驱力人工智能15 小时前
小区高空抛物AI实时预警方案 筑牢社区头顶安全的实践 高空抛物检测 高空抛物监控安装教程 高空抛物误报率优化方案 高空抛物监控案例分享
人工智能·深度学习·opencv·算法·安全·yolo·边缘计算
七夜zippoe15 小时前
CANN Runtime任务描述序列化与持久化源码深度解码
大数据·运维·服务器·cann
数据与后端架构提升之路15 小时前
论系统安全架构设计及其应用(基于AI大模型项目)
人工智能·安全·系统安全
Fcy64816 小时前
Linux下 进程(一)(冯诺依曼体系、操作系统、进程基本概念与基本操作)
linux·运维·服务器·进程
袁袁袁袁满16 小时前
Linux怎么查看最新下载的文件
linux·运维·服务器
代码游侠17 小时前
学习笔记——设备树基础
linux·运维·开发语言·单片机·算法
Gary Studio17 小时前
rk芯片驱动编写
linux·学习