请回答如下端口默认对应的服务,以及在渗透测试过程中我们可以从哪些角度考虑其安全问题。
端口:21、22、873、1433、3306、6379、11211
端口 | 服务 | 说明 |
21 | FTP | 匿名访问\弱口令 |
22 | SSH | 弱口令 |
873 | rsync | 未授权访问\弱口令 |
1433 | mssql | 弱口令 |
3306 | mysql | 弱口令 |
6379 | redis | 一般无验证,直接访问 |
11211 | memcache | 内存泄露\未授权访问 |
你所知道的网络抓包工具有哪些?对android或者ios设备怎么进行抓包。
tcpdump, Wireshark, Fiddler, Burp Suite, Charles
基于 WireShark 的方案:
基于 tcpdump 的方案:
基于 Fiddler/Burp Suite/Charles 的方案:
Burp Suite 是其中唯一支持交互式操作的软件
tcpdump 需要 root 权限,其他方案都不需要
wireshark 操作最简单,分析功能最强大,可以捕获数据包后配合进行分析
Burp Suite/Charles 跨平台性最好,也足够轻量级
另外的方式是使用专门的软件,如:AndroidHttpCapture、XCode 调试器中自带的 rvictl 命令等
请说明黑客常用的清除痕迹的方式及对应的监控方法(linux和windows系统)
wtmp/wtmpx 记录每次用户登录的信息,时间\终端\IP地址(last命令)
utmp/utmpx 记录以前登录到系统中的所有用户(who命令)
lastlog 记录每个用户最近一次的时间和登录点
acct 记录用户执行的所有命令
应用服务日志 记录了应用程序和系统产生的事件
系统日志 系统自身包括驱动程序等组件产生的时间
安全日志 与安全事件相关的信息
Elsave CLearLogs LogKiller 等程序
罗列最近几年影响较大的安全漏洞并请大概介绍其原理、危害(请列举3个)
介绍你所知道的加密算法,都属于什么类型的加密算法?怎么保证加密的安全性?
对称加密:DES 3DES AES
DES: DES 加密算法是一种分组密码,以64位为分组对数据加密,它的密钥长度是56位,加密解密用同一算法。DES加密算法是对密钥进行保密,而公开算法,包括加密和解密算法。这样,只有掌握了和发送方相同密钥的人才能解读由DES加密算法加密的密文数据。因此,破译DES加密算法实际上就是搜索密钥的编码。对于56位长度的密钥来说,如果用穷举法来进行搜索的话,其运算次数为256。
非对称加密:RSA ECC
RSA : RSA 加密算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但那时想要,但那时想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥。
```
PHP中了解有哪些容易导致漏洞的危险函数?并且简述会造成什么类型的风险
```
★ 命令注入
PHP 执行系统命令可以使用以下几个函数:system、exec、passthru、“、shell_exec、popen、proc_open、pcntl_exec,确定函数的参数是否会因为外部提交而改变,检查这些参数是否有经过安全处理
防范方法:
1. 使用自定义函数或函数库来替代外部命令的功能
2. 使用escapeshellarg 函数来处理命令参数
3. 使用safe_mode_exec_dir 指定可执行文件的路径
★ 跨站脚本
输出函数经常使用:echo、print、printf、vprintf、<%=$test%>
对于反射型跨站,因为是立即输出显示给客户端,所以应该在当前的 php 页面检查变量被客户提交之后有无立即显示,在这个过程中变量是否有经过安全检查。
对于存储型跨站,检查变量在输入后入库,又输出显示的这个过程中,变量是否有经过安全检查。
防范方法:
1. 如果输入数据只包含字母和数字,那么任何特殊字符都应当阻止
2. 对输入的数据经行严格匹配,比如邮件格式,用户名只包含英文或者中文、下划线、连字符
3. 对输出进行 HTML 编码
★ 文件包含
PHP 可能出现文件包含的函数:include、include_once、require、require_once、show_source、highlight_file、readfile、file_get_contents、fopen、 nt>file
防范方法:
1. 对输入数据进行精确匹配,比如根据变量的值确定语言 en.php、cn.php,那么这两个文件放在同一个目录下’language/’.$_POST[‘lang’].’.php’,那么检查提交的数据是否是en 或者cn 是最严格的,检查是否只包含字母也不错
2. 通过过滤参数中的/、..等字符
★ 代码注入
PHP 可能出现代码注入的函数:eval、preg_replace+/e、assert、call_user_func、call_user_func_array、create_function
防范方法:
1. 输入数据精确匹配
2. 白名单方式过滤可执行的函数
★ SQL注入
insert、delete、update、select
防范方法:
使用参数化查询
★ XPath注入
Xpath 用于操作xml,警惕提交给 xpath 函数的参数是否有经过安全处理
防范方法:
对于数据进行精确匹配
★ HTTP响应拆分
PHP 中可导致HTTP 响应拆分的情况为:使用header 函数和使用$_SERVER 变量。
防范方法:
1. 精确匹配输入数据
2. 检测输入输入中如果有\r 或\n,直接拒绝
★ 文件管理
PHP 的用于文件管理的函数,如果输入变量可由用户提交,程序中也没有做数据验证,可能成为高危漏洞。如下函数:copy、rmdir、unlink、delete、fwrite、chmod、fgetc、fgetcsv、fgets、fgetss、file、file_get_contents、fread、readfile、ftruncate、file_put_contents、fputcsv、fputs,但通常PHP 中每一个文件操作函数都可能是危险的。
防范方法:
1. 对提交数据进行严格匹配
2. 限定文件可操作的目录
★ 文件上传
PHP 文件上传通常会使用 move_uploaded_file
防范方法:
1. 使用白名单方式检测文件后缀
2. 上传之后按时间能算法生成文件名称
3. 上传目录脚本文件不可执行
4. 注意%00 截断
参考资料
拓展网站:PHP-Security
文件包含漏洞的常见WAF绕过方式(以读取/etc/passwd为例)
★ 利用phar://协议特性可以绕过一些waf检测,phar:// 数据流包装器自 PHP 5.3.0 起开始有效。
新建shell.php代码内容:
include 'phar://test.rar/test.txt';
?>
新建test.txt里的内容:
phpinfo();
?>
压缩test.txt文件,可以重命名压缩文件为zip,phar,rar等格式,之后访问shell.php文件后,会出现phpinfo内容。
★ 本地包含
新建一个phpinfo.txt,然后新建一个shell.php,写入:
Include("phpinfo.txt");
?>
访问shell.php会输出phpinfo页面内容,无论将扩展名改为什么,都将以php代码执行。如果文件不是符合php规则的(即没有写等),则通过include可以直接输出源码
★ 远程包含
新建php.txt:
echo "hello world";
?>
新建index.php:
Include($_GET['page']);
?>
访问http://www.xxxx.com/page=http://www.xxxx.com/php.txt执行结果将输出hello world。
文件包含漏洞(绕过)
文件上传漏洞(绕过)
现有一个需要注册才能使用的Android APP,打开APP时,
显示:请输入正确的序列号。如序列号不正确,提示:你输入的序列号错误。
问:如何对该APP进行分析破解,用最简单的,使之输入任意序列号即可使用。
请描述分析方法、使用工具
smali 和 baksmali 可以看做是 Android 的 assembler 和 disassembler
首先使用 JEB 打开 APP 的 APK 文件,反编译查看代码一步步跟进,静态分析吃力后使用 apktool 解开该 app 然后修改 AndroidManifest.xml 允许调试,再使用 apktool 再打包、signapk.jar 签名、baksmali 反编译,最后使用 Android Studio 进行动态调试
定位到需要更改的代码位置,代码更改后,重复上面的重新打包再签名的过程就能成功绕过序列号的判断
可以参考绿盟科技在乌云知识库上的文章《一次app抓包引发的Android分析记录》
请描述PE文件加壳、脱壳步骤?
加壳
脱壳
寻找程序入口点(OEP)
A. 根据跨段指令寻找
IDA Pro中有静态的跨段指令的视图(Segment),这里是动态的,基本的办法是单步跟踪。
B. 设置内存断点
在代码段释放完毕后,在代码段首部设置内存断点,中断后就是OEP
C. 根据堆栈平衡原理
D. 根据编译语言的特点(常见的初始化函数)找OEP
Dump 内存
参考资料
TCP三次握手的原理,并简单描述下端口扫描的几种实现方式及优缺点
三次握手原理
(1)第一次握手:Client将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给Server,Client进入SYN_SENT状态,等待Server确认。
(2)第二次握手:Server收到数据包后由标志位SYN=1知道Client请求建立连接,Server将标志位SYN和ACK都置为1,ack=J+1,随机产生一个值seq=K,并将该数据包发送给Client以确认连接请求,Server进入SYN_RCVD状态。
(3)第三次握手:Client收到确认后,检查ack是否为J+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=K+1,并将该数据包发送给Server,Server检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,Client和Server进入ESTABLISHED状态,完成三次握手,随后Client与Server之间可以开始传输数据了。
PING 扫描
向目标主机发送 ICMP 请求,如果收到了返回数据包则可以判断目标存活.但是 ICMP Ping 越来越多地被防火墙与路由器阻止.
TCP 半开放扫描
半开放扫描速度很快,可以达到每秒数千个端口.只发送一个设置 SYN 标志的数据包,等待来自目标主机的 SYN-ACK 返回数据包,而不会完成 TCP 握手过程.
收到 SYN-ACK 数据包之后可以判断端口可用/正在监听,如果收到 RST 数据包就可以判断目标存活但端口关闭了.如果你可以判断主机存活但没有得到响应,端口就应该是被过滤了.
TCP 全连接扫描
与半开放扫描相比,最后需要发送 ACK 数据包来建立连接,所以扫描速度被拖慢很多.
UDP 扫描
UDP 扫描最常见用来检测 DNS\SNMP\DHCP 服务,UDP 扫描通常是发送一个空包,也可以设置随机载荷填充.
如果目标主机返回类型3\代码3的 ICMP 无法访问错误,则可以判断端口是关闭的.如果是其他无法访问错误代码的数据包,则可以判断端口是被过滤的,如果没有收到响应数据包,则可以判断端口是打开或者被过滤的.
和任何使用 UDP 通信存在的问题一致,其不可靠.UDP 扫描都很慢,可能需要发送大量的数据包才能确认一个端口的开放性.
隐蔽扫描
NULL\FIN\X-MAS
FIN 扫描会发送一个不会真实产生的数据包,发送一个包含 FIN 标志的数据包但不先建立连接,如果收到 RST 数据包则端口是关闭的,如果没有收到数据包则端口是开放的
X-MAS 扫描设置 URG\PUSH\FIN 标志,如果没有收到数据包,端口是开放的,如果收到 RST 数据包,端口是关闭的
NULL 扫描也会发送一个不会真实产生的数据包,不设置 TCP 数据包的任何标志,如果收到 RST 数据包,端口是关闭的,如果没有收到相应数据包,是一个开放的端口.
这些扫描都尝试让目标主机产生某种类型的响应而不通过握手来建立连接,隐身扫描也意味着它们不会出现在日志中
SCTP INIT 扫描
SCTP INIT 扫描是 TCP SYN 扫描在 SCTP 上的等价物,同样可以快速执行,在不受防火墙限制的情况下每秒扫描数千个端口,只发送一个 INIT 块,等待一个响应
nmap 官网上有关于 nmap 实现很棒的阐述
有N个大小不等的自然数(1–N),乱序存于数组从1到n下标的空间中,请将它们由小到大排序,不能直接赋值或输出。
要求程序算法:时间复杂度为O(n),空间复杂度为O(1)。
void sort(int e[], int n)
{
int i;
int t; /*临时变量:空间复杂度O(1)*/
for (i=1; i1; i++) /*时间复杂度O(n)*/
{
while(e[i]!=i)
{
j++;
t = e[e[i]]; /*下标为e[i]的元素,排序后其值就是e[i]*/
e[e[i]] = e[i];
e[i] = t;
}
}
}
对任意输入的正整数N,编写C程序求N!的尾部连续0的个数,并指出计算复杂度。
如:17!=355687428096000,尾部连续0的个数是3。
(不用考虑数值超出计算机整数界限的问题
2*5即可得到0,则N!可以表示为k*(2^m)(5^n),由于在N!中m>>n,因此N!=k’(2*5)^n,即n为尾部为0的个数。
由此,我们只要考虑N!中包含多少个5的倍数就可以了,如25,含有5,10,15,20,25,包含6个5的倍数,即25!尾部有6个0。
n=N/5+N/(5^2)+N/(5^3)….+N/(5^k) (k<=N/5)
时间复杂度:O(log5N)
#include
using namespace std;
long long NumOfZero(long long n)
{
long long count=0;
while(n>0)
{
count+=n/5;
n=n/5;
}
return count;
}
long long factorial(long long n)
{
if(n==1)
return 1;
return n*factorial(n-1);
}
int main()
{
long long n=20;
cout<cout<return 0;
}
参考资料
从其他渠道获知A站被黑,同时黑客上传了webshell(是否被黑客删除未知),
该服务器上没有任何安全防御措施,只有web访问日志。
假如你是安全工程师小王,请你说明如何排查快速定位问题点,
同时设计有效的安全防御系统,防范类似情况发生,
防御系统至少包括sql注入、上传webshell等高危漏洞的防御措施。
溯源
防御
可以在网站前加一层软 WAF,资金允许的话,可以买一些 WAF 设备,也可以手工进行一些简单的防御,包括参数化语句、转义、设置白名单等,控制各级目录的读写权限,密码的复杂化,添加验证码等,时刻关注网站所用框架的通用漏洞,及时打补丁等等