渗透测试指南系列文章内容纲要
第一章 渗透测试简介
第二章 前期交互
第三章 信息收集
第四章 漏洞识别
第五章 社会工程学
第六章 有线/无线网络利用
第七章 基于应用的漏洞利用
第八章 基于本地主机和物理的利用
第九章 后-利用 技术
第十章 渗透测试工具集介绍
第十一章 渗透报告
本地主机漏洞利用内容
- 通用本地漏洞利用
- 不安全的服务和协议配置
- 本地越权
- Linux本地漏洞利用
- 理解Linux权限
- 不安全的sudo实现
- ret2libc攻击
- Windows权限
- CPassword
- LDAP明文凭证
- Kerberoasting
- LSASS
- SAM数据库
- DLL劫持
- 可利用的服务
- 不安全的文件和目录权限
- Windows组策略
- 键盘记录器
- 调度任务
- 沙箱和虚拟机
- 沙箱逃逸
- 虚拟机逃逸
- 容器安全
- 移动设备安全
- 安卓安全
- iOS安全
- 物理安全攻击
通用本地漏洞利用
不安全的服务和协议配置
未使用或者不安全的服务,协议和端口是本地攻击的一个重要攻击面。服务,端口,协议可以理解为每个对外开放的端口都对应后台的一个服务,而服务是通过协议来规范服务的范围和能力。
比如telnet,snmp v1,v2, syslog,IMAP, POP3等都属于不安全的服务,很容易被网络嗅探泄露敏感信息。很多时候服务是通过第三方软件提供的,这些软件可能存在安全漏洞,或者是使用了旧版本的软件没有及时打上补丁。
其他不安全的服务包括Rlogin,Rsh,Finger, Authd, Netdump,Netdump-server,Nfs,Rwhod, Sendmail,Samba,Yppasswdd,Ypserv,Ypxfrd等
最佳实践:清晰的记录业务所需要的端口,服务及协议,关闭不必要的服务,限制服务的可访问范围。及时更新服务的安全补丁。
本地提权
本地提权有两个方向,一个方向是从低级别的用户提升为另一个高级别用户,比如从omar用户提升为admin_user用户,脏牛漏洞就是一个例子。
另一个方向是通过改变用户的权限达到提权的目的,比如把user组的omar用户提升为admin组。这让我想起CVE-2019-14287这个漏洞,这是sudo绕过安全策略,执行敏感命令的漏洞。
Linux本地漏洞利用
理解Linux权限
你理解下面这个命令吗?
chmod 7777 this.file
如果不理解,可查看http://permissions-calculator.org/ 了解Linux系统的自主访问控制的授权体系。
sticky bit作用于目录是让目录下的文件只能由owner或者superuser删除或重命名,典型的例子就是tmp目录。
下面是SUID的设置,你能发现区别吗? 当owner的x权限被设置时,SUID显示为s,而当owner的x权限没被设置时,SUID显示为S
root@kali:~# chmod 4777 tmp.txt
root@kali:~# ls -al tmp.txt
-rwsrwxrwx 1 root root 0 Aug 17 07:55 tmp.txt
root@kali:~# chmod 4677 tmp.txt
root@kali:~# ls -al tmp.txt
-rwSrwxrwx 1 root root 0 Aug 17 07:55 tmp.txt
SUID设置的作用是让执行程序的用户能以程序owner的权限运行,典型的例子是passwd程序,这个程序要修改shadow文件,只能是root权限才可操作,但是普通用户可以通过这个命令修改自身的密码,用的就是这个机制。
不安全的sudo实现
sudo是super user do的缩写。sudo的作用是让普通用户以root的权限执行命令,sudo后面通常跟着一条命令。
另外一个和sudo很像的命令是su,su命令的作用是切换用户,如果后面不跟用户,则默认是root。
通常sudo和su是可以互相转换的
sudo 转为 su
$sudo -i
su 转 sudo
su -c 'command'
/etc/sudoers配置文件配置行介绍, 从左到右每个字段分别代表sudo用户,主机名,任意用户,任意组,可执行的命令。
root ALL=(ALL:ALL) ALL
The first field indicates the username that the rule will apply to (root).
root ALL=(ALL:ALL) ALL
The first “ALL” indicates that this rule applies to all hosts.
root ALL=(ALL:ALL) ALL
This “ALL” indicates that the root user can run commands as all users.
root ALL=(ALL:ALL) ALL
This “ALL” indicates that the root user can run commands as all groups.
root ALL=(ALL:ALL) ALL
The last “ALL” indicates these rules apply to all commands.
配置sudoers文件一定要谨慎,否则低权限用户拥有root权限,对系统可能造成的安全性影响就较大,潜在的风险也越高。
ret2libc攻击
栈溢出漏洞大家都很熟悉,当代码对内存操作不当,导致存在溢出漏洞时,比如strcpy函数。一种典型的攻击场景是攻击者通过溢出把shellcode注入到栈中,然后控制程序计数器跳转至栈中shellcode位置执行。
为了防止这类shellcode注入,操作系统集成了no-execute(NX)技术,这个技术把内存段设置RWX权限标签,和文件系统类似,这样只要把栈设置为RW-就可以解决shellcode注入栈中执行的问题。
道高一尺,魔高一丈。攻击者发现一类新的攻击方式,就是本章提到的ret2libc(return to libc)。这种攻击方式不是通过注入shellcode,而是通过控制程序计数器把控制流跳转到libc中,因为libc加载到内存后,肯定是可执行的,从而绕过了NX。
而基于ret2libc的还有一种高级的利用方式是ROP(return oriented programming)是利用libc的各种ret指令构造利用链,达到攻击目的。
ROP的入门材料,可参考 一步一步学ROP
为了防止ret2libc的利用,操作系统又实现了ASCII armoring和ASLR等技术,攻防双方相互抗衡,不断推进技术的发展。
Windows权限
CPassword
如果管理员使用CPassword执行常规任务比如修改本地管理员帐号,任何普通用户只要拥有SYSVOL目录的读权限,就可以获取认证密钥,接下来就可以通过John the Ripper或者Hashcat来破解帐户。
LDAP明文凭证
很多组织依旧配置其Windows域控制器支持明文凭证认证。一个简单的判断系统是否通过明文凭证认证,去Active Directory Service log查找ID为2886和2887的日志,如果存在这个编号的日志,则说明系统依旧用明文传输凭证。
Kerberoasting
Kerberoast是一系列攻击Microsoft Kerberos实现和Windows service accounts的工具集。这个工具可以从 https://github.com/nidem/kerberoast 获取。
查阅 https://www.blackhillsinfosec.com/a-toast-to-kerberoast/了解更多。
LSASS
可以通过Sysinternals ProcDump工具把LSASS(Local Security Authority Subsystem Service)进程的内存dump到硬盘,然后再通过Mimikatz获取用户凭证。
SAM数据库
SAM文件存放在 %SystemRoot%/system32/config/SAM 这个文件里存放着密码的hash值,获取到SAM文件后有两个用处,一个是用于pass the hash直接凭借hash绕过认证,一个是用于暴破密码。
DLL劫持
DLL是windows下的动态库后缀,和linux的so是一样的。根据系统配置,应用程序可以决定DLL的目录搜索顺序。攻击者利用加载顺序的先后,让程序优先加载当前目录下恶意的DLL库,执行恶意代码。
Windows下有个配置SafeDllSearchMode用于控制加载顺序,在注册表的HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\SafeDllSearchMode位置
SafeDllSearchMode的使能与不使能,加载顺序分别如下
If SafeDllSearchMode is enabled, the search order is as follows:
The directory from which the application loaded.
The system directory. Use the GetSystemDirectory function to get the path of this directory.
The 16-bit system directory. There is no function that obtains the path of this directory, but it is searched.
The Windows directory. Use the GetWindowsDirectory function to get the path of this directory.
The current directory.
The directories that are listed in the PATH environment variable. Note that this does not include the per-application path specified by the App Paths registry key. The App Paths key is not used when computing the DLL search path.
If SafeDllSearchMode is disabled, the search order is as follows:
The directory from which the application loaded.
The current directory.
The system directory. Use the GetSystemDirectory function to get the path of this directory.
The 16-bit system directory. There is no function that obtains the path of this directory, but it is searched.
The Windows directory. Use the GetWindowsDirectory function to get the path of this directory.
The directories that are listed in the PATH environment variable. Note that this does not include the per-application path specified by the App Paths registry key. The App Paths key is not used when computing the DLL search path.
更多内容可查看参考文献[1]
可利用的服务
操作系统执行应用程序时,有时不会用引号把应用程序引起来,而假设应用程序名带有空格时,就有利用的漏洞,假设应用程序为App run,那么攻击者在同一目录放一个恶意程序App,就会触发App被执行。
另外一个管理员经常把Windows服务配置为使用SYSTEM权限执行,攻击者可以通过服务或者服务所在的目录来获取权限。
不安全的文件和目录权限
攻击者可以利用不安全或错误配置的文件或目录权限达成攻击目的。
查看 https://docs.microsoft.com/en-us/windows/win32/fileio/file-security-and-access-rights了解更多。
Windows组策略
组策略(英语:Group Policy)是微软Windows NT家族操作系统的一个特性,它可以控制用户帐户和计算机帐户的工作环境。组策略提供了操作系统、应用程序和活动目录中用户设置的集中化管理和配置。组策略的其中一个版本名为本地组策略(缩写“LGPO”或“LocalGPO”),这可以在独立且非域的计算机上管理组策略对象。
组策略在部分意义上是控制用户可以或不能在计算机上做什么,例如:施行密码复杂性策略避免用户选择过于简单的密码,允许或阻止身份不明的用户从远程计算机连接到网络共享,阻止访问Windows任务管理器或限制访问特定文件夹。这样一套配置被称为组策略对象(Group Policy Object,GPO)。
键盘记录器
键盘记录器分为硬件记录器和软件记录器,其中硬件记录器为键盘接入电脑的中间设备,把键盘的信息记录下来。
软件键盘记录器可分为
- 基于内核的记录器
- 基于API的记录器 (类似于GetAsyncKeyState(), GetForeground()等API)
- Hypervisor based 记录器
- Web form grabbing 记录器
- 基于JavaScript的记录器
- 基于内存注入的记录器
调度任务
有时候系统安全等级调到很高,许多操作都需要二次确认,对攻击者来说不太友好,这时候可以考虑系统的调度任务,可以免掉这些麻烦。
Windows的任务调度在Start –> Programs –> Accessories –> System Tools –> Scheduled Tasks
沙箱和虚拟机
沙箱逃逸
以下是一些沙箱的实现
- A jail(苹果的越狱就是逃逸这个沙箱系统)
- Rule-based execution in SELinux and AppArmor security frameworks
- Virtual machines
- Sandboxing on native hosts
- Secure Computing Mode(seccomp) and seccomp-bpf(seccomp extension)
- Software fault isolation(SFI)
- Web browsers
- HTML5
- Java virtual machines
- .NET Common Language Runtime
- Adobe Reader
- Microsoft Office
沙箱逃逸指逃离沙箱的安全控制影响其他的应用甚至影响主操作系统。
虚拟机逃逸
虚拟机有两种类型,Type1 Native和Type2 Hosted,其中Type1是指在裸机上安装虚拟机管理软件,再在虚拟机管理软件上安装虚拟机,而type2是指先安装一个完整的操作系统,再在操作系统上安装管理虚拟机。
无论是哪种类型的虚拟机,逃逸均是指逃离当前虚拟机,控制虚拟机管理软件或者宿主机,进而去控制其他虚拟机或宿主机。
容器安全
虚拟机和容器的差别在于虚拟机是安装完整的操作系统,而容器可以理解为一个应用程序闭包,容器包含了应用程序所依赖的资源和环境。
容器安全包括
- Anchore
- Aqua Security
- Bane
- CIS Docker Benchmark
- Dev-Sec.io
- Clair
- Dagda
- docker-bench-security
- docker-explorer
- Notary
- oscap-docker
移动设备安全
以下是OWASP的移动端安全TOP10风险
- 不恰当的平台使用
- 不安全的数据存储
- 不安全的通信
- 不安全的认证
- 不充分的加密
- 不安全的授权
- 客户端代码质量
- 代码篡改
- 逆向工程
- 无关功能(Extraneous functionality)
以下是几个基本的篡改技术
- 二进制补丁(Binary patching)
- 代码注入(Code injection)
- 静态和动态二进制分析(Static and dynamic binary analysis)
- 调试和跟踪(Debugging and tracing)
安卓安全
在安卓系统中,每个应用都是运行在一个沙箱中,应用间不会互相干扰。应用的安装包放在 /data/app/[包名] 。apk包可以通过apktool解压提出包内容,提取包可以进一步逆向分析代码逻辑。
每个应用把自己的数据放在 /data/data/[包名] 这个目录中,如果把敏感信息明文存在在这个目录中是有问题的,至少应该做到良好的加密后在存放在这个目录。
Android的几个组件包括Activities,Services,Content providers, Broadcast receivers, Fragments, Intents
Android开发工具为Android Studio,模拟器包括Android Studio, Genymotion等,Android代码注入框架包括Cydia Substrate, FRIDA, XPosed等
Android安全测试工具/框架有Androick, NowSecure App Testing, OWASP SeraphimDroid, Mobile Security Framework(MobSF)
iOS安全
iOS安全架构包含以下6个部分
- 硬件安全(Hardware security)
- 安全启动(Security boot)
- 代码签名(Code signing)
- 沙箱(Sandbox)
- 加密和数据保护(Encryption and data protection)
- 常规利用消除(General exploit mitigations)
想要学习iOS安全,可以利用靶机环境如Damn Vulnerable iOS application和OWASP的iGoat。这些靶机环境配置了常见的安全漏洞,包括
- 不安全的数据存储(Insecure Data Storage)
- 越狱检测(Jailbreak Detection)
- 运行时修改(Runtime Manipulation)
- 传输层安全(Transport Layer Security)
- 客户端注入(Client Side Injection)
- 被破坏的加密(Broken Cryptography)
- 二进制补丁(Binary Patching)
- 侧信道数据泄露(Side Channel Data Leakage)
- 通过不可信输入的安全决策(Security Decisions via Untrusted Input)
MobiSec Live Environment Mobile Testing Framework这个工具可以帮助攻击者和防御者测试在线的环境去发现设计的弱点以及安全漏洞。
MITRE组织了一个iMAS项目,这个项目旨在保护iOS的应用和数据,减小iOS设备和应用的攻击面。项目地址为 https://github.com/project-imas
上面关于Android和iOS的安全描述非常粗糙,想深入学习移动端安全,强烈建议读者去精读 Mobile Security Testing Guide 这是OWASP的一个针对移动端的安全测试项目,和Web Security Testing Guide类似。 传送门 https://owasp.org/www-project-mobile-security-testing-guide/
物理安全攻击
冷启动攻击(Cold boot attacks)
冷启动攻击是指在设备关机后的数秒或者数分钟时间内,DRAM/SRAM中的数据还是可读的,趁关机后内存可读的这段时间把内存数据读取出来。
串口攻击(Serial console debugging)
许多设备不对串口做认证,默认信任可物理接触设备的人,只要能通过串口连接设备就可以配置和联系系统。通过串口可能泄露敏感信息,修改boot,system配置,甚至可以篡改flash中的固件。
JTAG调试(JTAG debugging)
攻击者可以通过JTAG访问寄存器,内存和中断。甚至可以改变程序的执行流。可以通过软件工具如OpenOCD配置JTAG来进行攻击操作。
其他物理攻击
- 尾随(Piggybacking/tailgating)
- 翻越围栏(Fence jumping)
- 垃圾搜寻(Dumpster diving)
- 撬锁(Lockpicking)
- (Egress sensors)
- 标记克隆(Badge cloning)
结语
这是本系列文章最后一篇,本系列文章内容主要来自“PenTest+ Cert Guide”一书各章节。这本书也是我准备PenTest+认证考试的重要参考材料。
总体而言很多时候内容也是点到为止,话说回来,你也不可能期望一本书能教你从入门到精通。
如果本系列文章对你有一点点的帮助,那我花这么多时间写这些内容就有价值了。
最后也希望自己继续努力,百尺竿头,更进一步,后续能为读者贡献更高质量的文章,谢谢大家!
由于笔者水平有限,文章难免会有错误的,欢迎读者批评指正。笔者个人邮箱:[email protected]
参考文献
[1] https://docs.microsoft.com/en-us/windows/win32/dlls/dynamic-link-library-search-order
[2] PenTest+ Cert Guide
来源:freebuf.com 2020-08-25 13:53:52 by: nobodyshome
请登录后发表评论
注册