Linux 安全工具
主机|端口扫描
nmap
主要功能:
- 主机发现
- 端口扫描
- 版本检测
- OS猜测
主机发现
类似于ping,发送探测包到指定主机,如果得到回复则说明主机在线
nmap -sn IP|CIDR
原理:
-
内网
- 发送
arp
广播
Address Resolution Protocol 地址解析协议
- 发送
-
外网
发送
ICMP echo request
发送tcp
SYN
到443
发送tcp
ACK
到80
Why ACK to 80 and SYN to 443?
提供SYN和ACK两种ping探测的原因是使通过防火墙的机会尽可能大。-
许多管理员会配置他们的路由器或者其它简单的防火墙来封锁SYN报文,除非 连接目标是那些公开的服务器像公司网站或者邮件服务器。 这可以阻止其它进入组织的连接,同时也允许用户访问互联网。 这种无状态的方法几乎不占用防火墙/路由器的资源,因而被硬件和软件过滤器 广泛支持。当这样的无状态防火墙规则存在时,发送到关闭目标端口的SYN ping探测 (
-PS
) 很可能被封锁。这种情况下,ACK探测格外有闪光点,因为它正好利用了这样的规则。另外一种常用的防火墙用有状态的规则来封锁非预期的报文。 这一特性已开始只存在于高端防火墙,但是这些年类它越来越普遍了。 SYN探测更有可能用于这样的系统,由于没头没脑的ACK报文 通常会被识别成伪造的而丢弃。解决这个两难的方法是通过即指定
-PS
又指定-PA
来即发送SYN又发送ACK。 发送
ICMP timestamp request
只要获取到一个回应包,就认为此主机在线
端口扫描
nmap -sS -SU IP|CIDR -p T:TCP-PORT,U:UDP-PORT
原理:
- TCP SYN 扫描 (-sS):TCP半开放扫描,不建立完整的TCP连接。向目标端口发送
SYN
,如果收到SYN
或ACK
回复,认为端口开放(open);如果收到RST
,认为端口关闭(closed);如果无回应,认为端口被防火墙屏蔽(filtered)。 - UDP扫描(-sU):向目标端口发送探测包,如果收到
ICMP port unreachable
,则说明端口未开放;如果无回应,则端口可能开放或被拦截(open|filtered)。
-p PORT-RANGE
--top-ports NUM
版本检测
nmap -sV IP|CIDR -p PORT
OS猜测
不同OS对tcp/IP协议的实现方式可能有些许差异,nmap就利用这一点,向目标主机发送精心设计的TCP/UDP/ICMP数据包,根据返回的数据包生成一份系统指纹。
而nmap有一个常见OS指纹特征数据库,将获取到的指纹进行对比,如果匹配就直接返回OS信息,如果无匹配就会进行猜测。
当目标主机至少存在一个开放端口和一个关闭端口时,OS猜测才能正常进行。
nmap -O IP|CIDR
防火墙
iptables
CentOS 7及之后默认安装了firewalld
替代iptables
作为防火墙工具。
个人习惯换回iptables
:
systemctl stop firewalld
systemctl disable firewalld
systemctl mask firewalld
yum -y install iptables-services
systemctl enable iptables
systemctl restart iptables
Linux系统中真正实现防火墙功能的是系统的netfilter框架,而不论是
firewalld
还是iptables-services
都只是一个类似于用户代理的身份,方便用户使用它向内核管理规则。
table
根据规则功能的不同可分为四表:
-
raw
:控制数据包是否被追踪 -
mangle
:修改数据包的类型、TTL等 -
nat
:网络地址转换 -
filter
:过滤数据包
CHAIN
默认有5个Chain:INPUT
、OUTPUT
、FORWARD
、PREROUTING
和POSTROUTING
match
- 基本:源ip地址(source ip,-s)、目标ip地址(destination ip,-d)
- 扩展:源端口(--sport)、目标端口(--sport)
- 协议:-p {tcp|udp|all|icmp ...}
TARGET
ACCEPT
:放行DROP
:丢弃-
REJECT
:拒绝...
iptables命令
iptables OPTIONS [CHAIN_NAME]
查看(某个chain)的规则
-L 显示规则列表,如果后面接CHAIN_NAME则表示只查看某个chain的
-n 禁用域名解析
--line或--line-numbers 显示序号
-v 显示更多信息
-t 查看某个表,默认filter
iptables {-I|-A} [number] [-s|-d ipaddress] [-p {tcp|udp|all}] [--dport|sport port] -j {ACCEPT|DROP...}
在每条Chain中,遵循从上到下的顺序进行匹配,因此顺序是非常重要的
iptables -D {rule_details | number}
使用iptables
进行的规则操作都是临时的,重启或reload都会丢失当前配置的规则。要永久生效需要保存规则到/etc/sysconfig/iptables
iptables-save
打印配置到屏幕,配合重定向>
即可保存到文件
口令破解
John the Ripper
破解加密密码
Linux下用户和密码存储在/etc/shadow
和/etc/passwd
下,采用SHA-512加密,同时采用了salt
盐值,保证相同的密码其加密后的字符串也不同。
john --single
john --wordlist=password.lst
hydra
[图片上传失败...(image-9de074-1584971513588)]
密码爆破工具。
- 可对多种服务的账号及密码进行爆破,如web登录、SSH、数据库、FTP、RDP(Windwos远程桌面)等等。
- 支持多线程。
SSH安全
[图片上传失败...(image-e162f9-1584971513588)]
fail2ban
介绍
基于认证日志工作,通过扫描日志中的关键字,来更新防火墙规则,从而在指定时间内拒绝某ip的连接。
配置
配置目录/etc/fail2ban/
主配置文件/etc/fail2ban/jail.conf
自定义配置文件目录/etc/fail2ban/jail.d/
jail.conf可能会随着版本更新被覆盖。
因此建议把自定义的配置放置在jail.d下,而不是直接修改jail.conf。
jail.d下的配置(*.local或*.conf)会覆盖jail.conf的相关配置。
过滤器目录/etc/fail2ban/filter.d
动作配置文件目录/etc/fail2ban/action.d
fail2ban日志/var/log/fail2ban.log
fail2ban能够降低暴力破解的速度,但不能减弱弱口令的风险。
在SSH上的应用
自定义配置文件/etc/fail2ban/jail.d/sshd.local
[sshd]
enabled = true
port = 22
findtime = 60
maxretry = 10
bantime = 120
filter = sshd
banaction = iptables-allports
ignoreip = 127.0.0.1/8 192.168.0.0/16
logpath = /var/log/secure
使用systemctl restart fail2ban
运行fail2ban服务
修改配置后,使用systemctl reload fail2ban
重载配置
fail2ban通过向iptables内添加规则来达到效果,如果重启了iptables,fail2ban添加的规则会消失(因为这些规则并未持久化到iptables规则文件中),fail2ban便会失效,因此重启iptables后也需要重启fail2ban服务
fail2ban-client命令
fail2ban-client status
当前运行的jail
fail2ban-client reload
fail2ban-client status JAIL_NAME
某个jail的状态
会显示当前时间段内失败的次数,以及被ban掉的ip
fail2ban-client set JAIL_NAME banip IPADDR
手动ban掉某个ip
fail2ban-client set JAIL_NAME unbanip IPADDR
手动unban某个ip
fail2ban-client set JAIL_NAME addignoreip IPADDR
将某个ip加到白名单内(重启失效)
fail2ban-client set JAIL_NAME delignoreip IPADDR
从白名单内删除某个ip
fail2ban-client get JAIL_NAME ignoreip
查看白名单
在nginx上的应用
一个非常简单的示例:限制某个ip在单位时间内的请求次数,防止某些攻击
-
新建过滤器
/etc/fail2ban/filter.d/nginx-test-limit.conf
[Definition] failregex = <HOST>.*HTTP/1.1
使用正则表达式来匹配
-
新建jail
/etc/fail2ban/jail.d/nginx-test-limit.local
[nginx-test-limit] enabled = true port = http,https findtime = 60 maxretry = 10 bantime = 20 logpath = /data/log/nginx_access.log banaction = iptables-allports
jail名需要与过滤器文件名相同
沙箱
firejail
介绍
https://firejail.wordpress.com/
firejail为不受信任的应用程序提供有限的运行环境和资源。
安装
wget https://phoenixnap.dl.sourceforge.net/project/firejail/firejail/firejail-0.9.60-1.x86_64.rpm && yum localinstall firejail-0.9.60-1.x86_64.rpm
使用
firejail
启动一个bash沙箱firejail COMMAND
在沙箱里运行指定的命令-
firejail [OPTIONS] COMMAND
--help https://firejail.wordpress.com/features-3/man-firejail/ --blacklist=filename 将某文件/路径加到黑名单,使沙箱程序不能访问 --whitelist=filename 将某文件/路径加到白名单(只有程序指定的路径能被加到白名单) --env=name=value 配置环境变量 --private 禁止沙箱读取home下的文件,创建一个新的空的home目录,家目录中的文件会在沙箱退出后被删除 --get=name|pid filename 从沙箱中提取某个文件 --put=name|pid src-filename dest-filename 向沙箱里发送文件 --name=name 命名 --list --join=name|pid 连接到沙箱 --net=none 禁止此沙箱联网 --shutdown=name|pid 关闭某个沙箱
配置
目录 /etc/firejail
下有很多(约800+)配置文件,对应不同的命令沙箱配置
配置文件man页面
漏洞扫描
nessus
免费版:最多扫描16个ip