Open mylamour opened 6 years ago
索引目标,选择协议,建立连接,端口开放则发送报文。解析返回的内容or banner,在其中搜索pattern,判断结果目标端口及类型。主要涉及到有扫描算法,索引算法,搜索算法(优化后的AC自动机算法,详见源码smack1.c
)。暂时不涉及pfring。
struct Banner1
{
struct SMACK *smack;
struct SMACK *http_fields;
struct SMACK *html_fields;
struct SMACK *memcached_responses;
struct SMACK *memcached_stats;
unsigned is_capture_html:1;
unsigned is_capture_cert:1;
unsigned is_capture_heartbleed:1;
unsigned is_capture_ticketbleed:1;
unsigned is_heartbleed:1;
unsigned is_ticketbleed:1;
unsigned is_poodle_sslv3:1;
struct ProtocolParserStream *tcp_payloads[65536];
};
数据包传送的主要函数为以下三个,解析返回时的数据在smack,发送的数据格式有专门的template
,在templ-payloads.h
rawsock_send_packet
rawsock_recv_packet
rawsock_send_probe
以文档中的js为例,这是核心的扫描算法。
function Range(begin,end){
}
function RangeList(){
// A list of Range
}
function Targets(){
}
function TransmitThread(targets, transmit, seed) {
var range = targets.ips.count() * targets.ports.count();
var b = Blackrock(range, seed);
for (var i = 0; i < range; i++) {
var xXx = b.shuffle(i);
var ip_index = Math.floor(xXx / targets.ports.count());
var port_index = Math.floor(xXx % targets.ports.count());
var ip = targets.ips.pick(ip_index);
var port = targets.ports.pick(port_index);
transmit(ip, port);
}
}
整体并不难理解。然后我们看到了Blackrock这个东西,这个东西是什么?
使用真正的DES加密会限制置换后的范围为2-14,作者因此需要做一些操作使得二进制运算符和非二进制运算相等(不懂什么意思),例如XOR。
function Blackrock(range, seed) {
var split = Math.floor(Math.sqrt(range * 1.0));
this.rounds = 3;
this.seed = seed;
this.range = range;
this.a = split - 1;
this.b = split + 1;
while (this.a * this.b <= range)
this.b++;
/** Inner permutation function */
this.F = function (j, R, seed) {
var primes = [961752031, 982324657, 15485843, 961752031];
R = ((R << (R & 0x4)) + R + seed);
return Math.abs((((primes[j] * R + 25) ^ R) + j));
}
/** Outer feistal construction */
this.fe = function (r, a, b, m, seed) {
var L, R;
var j;
var tmp;
L = m % a;
R = Math.floor(m / a);
for (j = 1; j <= r; j++) {
if (j & 1) {
tmp = (L + this.F(j, R, seed)) % a;
} else {
tmp = (L + this.F(j, R, seed)) % b;
}
L = R;
R = tmp;
}
if (r & 1) {
return a * L + R;
} else {
return a * R + L;
}
}
/** Outer reverse feistal construction */
this.unfe = function (r, a, b, m, seed) {
var L, R;
var j;
var tmp;
if (r & 1) {
R = m % a;
L = Math.floor(m / a);
} else {
L = m % a;
R = Math.floor(m / a);
}
for (j = r; j >= 1; j--) {
if (j & 1) {
tmp = this.F(j, L, seed);
if (tmp > R) {
tmp = (tmp - R);
tmp = a - (tmp % a);
if (tmp == a)
tmp = 0;
} else {
tmp = (R - tmp);
tmp %= a;
}
} else {
tmp = this.F(j, L, seed);
if (tmp > R) {
tmp = (tmp - R);
tmp = b - (tmp % b);
if (tmp == b)
tmp = 0;
} else {
tmp = (R - tmp);
tmp %= b;
}
}
R = L;
L = tmp;
}
return a * R + L;
}
this.shuffle = function (m) {
var c;
c = this.fe(this.rounds, this.a, this.b, m, this.seed);
while (c >= this.range)
c = this.fe(this.rounds, this.a, this.b, c, this.seed);
return c;
}
this.unshuffle = function (m) {
var c;
c = unfe(this.rounds, this.a, this.b, m, this.seed);
while (c >= this.range)
c = unfe(this.rounds, this.a, this.b, c, this.seed);
return c;
}
return this;
}
function transmit(ip, port) { var proto = "tcp"; if (port > 65536 2) { proto = "sctp"; port -= 65536 2; } else if (port > 65536) { proto = "udp"; port -= 65536; }
var ipstring = ((ip >> 24) & 0xFF)
+ "." + ((ip >> 16) & 0xFF)
+ "." + ((ip >> 8) & 0xFF)
+ "." + ((ip >> 0) & 0xFF)
console.log("--> " + ipstring + " " + proto + ":" + port);
}
# 协议
```c
struct Masscan
{
//...
struct {
unsigned tcp:1;
unsigned udp:1;
unsigned sctp:1;
unsigned ping:1;
} scan_type;
//...
}
可以看出masscan支持上述四种协议。而从js代码里可以看出来port索引个数少于65536的采用tcp扫描,大于的采用udp扫描,大于两倍及以上的采用sctp扫描。
连接: syn-syn/ack-ack
关闭: fin-ack-fin-ack
不仅提供了像 TCP 一样可靠、有序地发送数据的功能,而且可以像UDP一样面向消息的方式来进行操作,这可以保护消息边界。高级特性:
多宿主(Multi-homing) 两台主机之间,可以使用每台主机上的多个接口进行协作
多流(Multi-streaming) 一个联合中的所有流都是独立的,但均与该联合相关
初始化保护(Initiation protection)
多了个cookie-ack
消息分帧(Message framing) 当一端对一个套接字执行写操作时,可确保对等端读出的数据大小与此相同
可配置的无序发送(Configurable unordered delivery)
平滑关闭(Graceful shutdown)
当然除了这些方式,结束之后还突然想到了:
衍生问题是: a. 对写同一个文件时出现同时写怎么办?
现在才发现,面试官问我出现同时写的情况怎么办,因为并没有出现过。所以一瞬间也没想到。一着急就懵逼了。(资料说multiprocessing 本身避免了GIL的问题)。
b. 进程间数据间如何同步,或者线程间数据如何同步? 具体记不清了,就是问数据如何同步,由于进程是独立的内存,而线程是共享内存。线程间的通信,在python中可以采用queue的方式(我在proxycheck里就是这样实现的,然而没有回答出来,真让人头秃)。
def worker():
while True:
item = q.get()
do_work(item)
q.task_done()
q = Queue()
for i in range(num_worker_threads):
t = Thread(target=worker)
t.daemon = True
t.start()
for item in source():
q.put(item)
q.join()
还可以采用Pipe
的方式, 如果只是为了分享状态可以采用Array
实现。(以上都是基于python的multiprocessing)
上述方式GIL没有关系,和面试官想引导的方向不一样,这一题GG了。
GIL不是python特性,是Cpython实现导致的。像Jython,IronPython并不具有这种问题。
Python 3.2开始使用新的GIL。新的GIL实现中用一个固定的超时时间来指示当前的线程放弃全局锁。在当前线程保持这个锁,且其他线程请求这个锁时,当前线程就会在5毫秒后被强制释放该锁。
5.你觉得你发现的那个漏洞影响比较大,挖到时的难点在哪里。
经过确认之后,说了不一定是纯技术的。可以从影响上面来说。个人觉得操作系统级别的漏洞,框架级别的RCE,错误配置以及敏感信息泄露危害比较严重。 然而这个是要根据自身来讲,并且范围有点限定在web的感觉。所以就讲了下一个api key分享链接中key泄露事件(应该再讲下oauth授权对redirect_uri无验证)。但从技术上来说,这两个案列其实都不存在技术壁垒。只是认真的测一下就能发现。
关于难点,今天突然想到,可以把微盟的那个案例拿出来说一下,扫描到集群的后台之后,可进行密码爆破,但是密码强度应该比较强。然后github信息泄露收集点进去该员工的repo,发现并无密码,最后查看commit的历史发现之前提交过的密码选项,通过该员工的权限进入之后,后面就是后渗透了。基本可以登录所有平台,以及LDAP服务器,最后等等。而且很幸运的是这个员工已经准备离职交接了,所以并不容易发现我的行踪。最后截图走人。
但自己也没有挖到过0Day,最后就GG了。祈祷以后挖到厉害的0day,像去年的s2-048,即便不知道原理,拿来就用,威力一样大的不行。
2.1. 如果是你如何进行反爬虫,如何绕过反爬措施。使用无头浏览器被检测到了,如何绕过
web端
表示没想起来全,只想起来了几个。
后端
越想越觉得这个方式可行啊。实时日志分析,请求内容相似度分析,关联分析???
当时谈到了京东的代码检测里有针对无头浏览器这一块,会检测phantomjs
,ghost
这一类的关键词。如果是我我是会重新编译一下,改个名字就行了。
2.3. nmap扫描如何进行扫描。发包与协议,握手和不握手,哪些协议握手,哪些不握手,如何不直接接触目标服务器探测对方端口是否开放
暂时pass,这个问题已经第二次出现了,同程也问过。之后学习了再详解
2.6. xss什么原理,如何自己实现一个beef类似的xss平台 ,面临的跨域如何解决? 一切可控输入在响应中有输出。 如何实现,hook.js的页面和不停的轮训服务器。这样就面临着跨域问题。
ajxa
请求数据,请求之后,由回调函数进行解析.详细参考这篇
```php
$callback= !empty($_GET['callback']) ? $_GET['callback'] : 'callback';
echo $callback.'(.json.encode($data).)';
document.domain
适用于主域相同的跨域
http://dev.aha.com/list.html
中设置为document.domain="aha.com";
就可以访问http://static.aha.com
下的资源了
windows.name -> location.href
nginx 反向代理
websocket
location.hash
配置
*
,slef
,unsafe-inline
,strict-dynamic
think:
动态生成的nonce字符串(nonce-{random-str}
),只包含nonce字段并字符串相等的script块可以被执行。这应该是比较好的防御方式,但是也是有问题的。应该黑名单配合CSP。
4月3号,愚人节后的两天,也恰是清明的前两天。意外收到来自京东的面试,简历是3月28号投的,未曾想到能会通过筛选,面试官聊了一会,不出意外,并没有通过。自省之余,对其中的5道问题并不能很好的回答,因此予以记录
一面
Other
Backup 收货很多,面试官脾气很好,虽不曾相识,但十分感谢。保持学习,以免退步。
二面和三面是一天,周四,4月19号。请了一天假,太阳很热。没想到的是夏初的时候,两盆绿植却要凋零了。熬过了秋冬春,却没赶得上盛夏。不过生命的尽头就是死亡,也没什么可悲哀的。早走晚走都是要走的。
二面
{k1:v1, k2:v2, k3:v3}
,保证同时在k1中的v1里出现特定值,k2中出现v2特定值,以及k3,v3。怎么实现Other 对移动安全有了解吗?你想不想做移动安全
Backup 顺着问,都能挖的深,不仅在面试,更像是在讨论。自己觉得自己实力不行,但这并不是放弃。所有的答案都会自己找到,也将会站在终点。或者永远没有终点。
三面
你有什么想问我的 Q1: masscan是怎么实现扫描的?
Q2.1:你是xxx吗? Q2.2: 能介绍下这边的移动安全主要在做什么的? Q2.3: 要涉及到扫描器编写吗?
Q3: 这个问题本来是想问2面的,当时觉得自己1面不太好时,恰好看到这句话,三十而立四十balabala,七十而从心所欲不逾矩。你如何理解 A3.: 我不信这个
Other: 信,不信。无所谓的。但你该问还是要问的。