1. 인시큐어뱅크 앱 이란?
- 모바일 뱅킹 취약점 진단을 위한 테스트 용도로 제작된 애플리케이션이다.
- 안드로이드 앱 취약점 진단을 실습할 수 있는 환경을 제공한다.
- 2019년 이후로 업데이트가 중단되었다.
2. 취약점 진단 실습 가능 항목
- 인시큐어뱅크 앱에서 아래와 같은 25가지 항목을 실습할 수 있다.
결함이 있는 브로드캐스트 수신기 | 메모리의 민감한 정보 | 사용자 이름 열거 문제 |
의도 스니핑 및 주입 | 안전하지 않은 로깅 메커니즘 | 개발자 백도어 |
약한 인증 메커니즘 | 안드로이드 페이스트보드 취약점 | 약한 변경 암호 구현 |
로컬 암호화 문제 | 애플리케이션 디버깅 가능 | 파라미터 조작 |
취약한 활동 구성 요소 | Android 키보드 캐시 문제 | 하드코딩된 비밀 |
루트 탐지 및 우회 | 안드로이드 백업 취약점 | 약한 암호화 구현 |
에뮬레이터 감지 및 우회 | 런타임 조작 | 애플리케이션 패치 |
안전하지 않은 콘텐츠 제공자 액세스 | 안전하지 않은 SDCard 스토리지 | 안전하지 않은 HTTP 연결 |
안전하지 않은 Webview 구현 |
3. 파이썬 2.7.18 버전 설치
인시큐어뱅크 앱을 실행하기 위해선 인시큐어뱅크 서버를 PC에 설치하여야 한다.
인시큐어뱅크 서버는 파이썬 2 버전에서만 동작하므로, 아래의 링크에 접속하여 파이썬 2.7.18 버전을 설치한다.
https://www.python.org/downloads/release/python-2718/
4. 인시큐어뱅크 서버 설치 및 실행
- 아래의 사이트에 접속하여 Server.zip 파일을 다운로드한다.
https://github.com/dineshshetty/Android-InsecureBankv2/releases/tag/2.3.1
- 다운로드한 압축파일을 해제한다.
※ 압축파일 해제 경로에 한글이 들어가면 실행 시 오류가 발생한다.
- 아래의 명령어를 실행하여 서버 구동에 필요한 파일을 다운로드한다.
# 압축 해제 경로로 이동
cd C:\AndroLabServer
# 서버 실행에 필요한 파일 다운로드
pip install -r requirements.txt
- app.py 파일을 메모장으로 열어 아래와 같이 내용을 변경한다.
# 3 line을 아래와 같이 수정
# from web.wsgiserver import CherryPyWSGIServer
from cheroot.wsgi import Server as CherryPyWSGIServer
- 아래의 명령어를 입력하여 서버를 실행한다.
python app.py
5. 인시큐어뱅크 앱 설치
- 아래의 사이트에 접속하여 InsecureBankv2.apk 파일을 다운로드한 뒤 디바이스에 설치한다.
https://github.com/dineshshetty/Android-InsecureBankv2/releases/tag/2.3.1
- 본문에선 안드로이드 가상환경 녹스(nox)에 설치하였음.
※ Nox에 설치할 경우 Android 7(32bit) 버전에 설치하여야 정상 동작하므로 주의할 것.
6. 인시큐어뱅크 앱 실행
- 설치한 인시큐어뱅크 앱을 실행한 후, 서버와의 연결을 위해 IP/Port 설정을 진행한다.
- 설정을 마치고 Submit 버튼을 클릭하면 "Server Configured Successfully!!"라는 토스트 알림이 뜬다.
※ Server IP는 PC의 현재 IP주소를 입력하면 된다.
- 아래의 계정정보를 입력하여 로그인을 시도한다.
# 인시큐어뱅크 기본 계정정보(default ID/PW)
username : dinesh
password : Dinesh@123$
username : jack
password : Jack@123$
7. 오류 해결방법
7.1. 지정한 서비스 포트가 사용중일 경우
- PC에서 8888 포트를 이미 사용하고 있을 경우 아래와 같은 오류가 발생한다.
- app.py 실행 시 포트를 지정하여 실행하여 오류를 해결한다.
오류내용#1 |
The server is hosted on port: 8888 Traceback (most recent call last): File "app.py", line 155, in <module> server.start() File "C:\Python\lib\site-packages\cheroot\server.py", line 1849, in start self.prepare() File "C:\Python\lib\site-packages\cheroot\server.py", line 1804, in prepare raise socket.error(msg) socket.error: No socket could be created -- (('0.0.0.0', 8888): [Errno 10048] 각 소켓 주소(프로토콜/네트워크 주소/포트)) |
해결방법#1 |
python app.py --port [포트번호] |
#에러(error) 해결방법
python app.py --port 포트번호
7.2. 지정한 서비스 포트가 사용중일 경우
- app.py 실행경로에 한글이 들어갔을 경우 로그인 에러가 발생한다. 서버 경로에 한글이 없도록 조치한다.
오류내용#2 |
The server is hosted on port: 8888 [2023-11-17 09:51:50,786] ERROR in app: Exception on /login [POST] Traceback (most recent call last): File "C:\Users\hagsig\anaconda3\envs\py_2.7.18\lib\site-packages\flask\app.py", line 2447, in wsgi_app response = self.full_dispatch_request() File "C:\Users\hagsig\anaconda3\envs\py_2.7.18\lib\site-packages\flask\app.py", line 1952, in full_dispatch_request rv = self.handle_user_exception(e) File "C:\Users\hagsig\anaconda3\envs\py_2.7.18\lib\site-packages\flask\app.py", line 1821, in handle_user_exception reraise(exc_type, exc_value, tb) File "C:\Users\hagsig\anaconda3\envs\py_2.7.18\lib\site-packages\flask\app.py", line 1950, in full_dispatch_request rv = self.dispatch_request() File "C:\Users\hagsig\anaconda3\envs\py_2.7.18\lib\site-packages\flask\app.py", line 1936, in dispatch_request return self.view_functions[rule.endpoint](**req.view_args) File "app.py", line 36, in login u = User.query.filter(User.username == request.form["username"]).first() File "C:\Users\hagsig\anaconda3\envs\py_2.7.18\lib\site-packages\sqlalchemy\orm\query.py", line 2824, in first return self.limit(1)._iter().first() File "C:\Users\hagsig\anaconda3\envs\py_2.7.18\lib\site-packages\sqlalchemy\orm\query.py", line 2919, in _iter execution_options={"_sa_orm_load_options": self.load_options}, File "C:\Users\hagsig\anaconda3\envs\py_2.7.18\lib\site-packages\sqlalchemy\orm\session.py", line 1716, in execute conn = self._connection_for_bind(bind) File "C:\Users\hagsig\anaconda3\envs\py_2.7.18\lib\site-packages\sqlalchemy\orm\session.py", line 1556, in _connection_for_bind engine, execution_options File "C:\Users\hagsig\anaconda3\envs\py_2.7.18\lib\site-packages\sqlalchemy\orm\session.py", line 750, in _connection_for_bind conn = bind.connect() File "C:\Users\hagsig\anaconda3\envs\py_2.7.18\lib\site-packages\sqlalchemy\engine\base.py", line 3325, in connect return self._connection_cls(self, close_with_result=close_with_result) File "C:\Users\hagsig\anaconda3\envs\py_2.7.18\lib\site-packages\sqlalchemy\engine\base.py", line 96, in __init__ else engine.raw_connection() File "C:\Users\hagsig\anaconda3\envs\py_2.7.18\lib\site-packages\sqlalchemy\engine\base.py", line 3404, in raw_connection return self._wrap_pool_connect(self.pool.connect, _connection) File "C:\Users\hagsig\anaconda3\envs\py_2.7.18\lib\site-packages\sqlalchemy\engine\base.py", line 3375, in _wrap_pool_connect e, dialect, self File "C:\Users\hagsig\anaconda3\envs\py_2.7.18\lib\site-packages\sqlalchemy\engine\base.py", line 2209, in _handle_dbapi_exception_noconnection sqlalchemy_exception, with_traceback=exc_info[2], from_=e File "C:\Users\hagsig\anaconda3\envs\py_2.7.18\lib\site-packages\sqlalchemy\engine\base.py", line 3371, in _wrap_pool_connect return fn() File "C:\Users\hagsig\anaconda3\envs\py_2.7.18\lib\site-packages\sqlalchemy\pool\base.py", line 327, in connect return _ConnectionFairy._checkout(self) File "C:\Users\hagsig\anaconda3\envs\py_2.7.18\lib\site-packages\sqlalchemy\pool\base.py", line 894, in _checkout fairy = _ConnectionRecord.checkout(pool) File "C:\Users\hagsig\anaconda3\envs\py_2.7.18\lib\site-packages\sqlalchemy\pool\base.py", line 493, in checkout rec = pool._do_get() File "C:\Users\hagsig\anaconda3\envs\py_2.7.18\lib\site-packages\sqlalchemy\pool\impl.py", line 256, in _do_get return self._create_connection() File "C:\Users\hagsig\anaconda3\envs\py_2.7.18\lib\site-packages\sqlalchemy\pool\base.py", line 273, in _create_connection return _ConnectionRecord(self) File "C:\Users\hagsig\anaconda3\envs\py_2.7.18\lib\site-packages\sqlalchemy\pool\base.py", line 388, in __init__ self.__connect() File "C:\Users\hagsig\anaconda3\envs\py_2.7.18\lib\site-packages\sqlalchemy\pool\base.py", line 691, in __connect pool.logger.debug("Error on connect(): %s", e) File "C:\Users\hagsig\anaconda3\envs\py_2.7.18\lib\site-packages\sqlalchemy\util\langhelpers.py", line 72, in __exit__ with_traceback=exc_tb, File "C:\Users\hagsig\anaconda3\envs\py_2.7.18\lib\site-packages\sqlalchemy\pool\base.py", line 686, in __connect self.dbapi_connection = connection = pool._invoke_creator(self) File "C:\Users\hagsig\anaconda3\envs\py_2.7.18\lib\site-packages\sqlalchemy\engine\create.py", line 574, in connect return dialect.connect(*cargs, **cparams) File "C:\Users\hagsig\anaconda3\envs\py_2.7.18\lib\site-packages\sqlalchemy\engine\default.py", line 598, in connect return self.dbapi.connect(*cargs, **cparams) OperationalError: (sqlite3.OperationalError) unable to open database file (Background on this error at: https://sqlalche.me/e/14/e3q8) [!] 500 Internal Server Error: The server encountered an internal error and was unable to complete your request. Either the server is overloaded or there is an error in the application. |
해결방법#2 |
경로에 한글이 없도록 조치한다. |
- python 2.7.18 외 다른 버전의 python이 설치되어 있거나, 다른 버전이 환경변수로 등록되어 있을 경우 로그인 오류가 발생한다. python 2.7.18 버전을 환경변수로 등록하고 나머지 버전은 모두 삭제한다.
- ImportError: No module named wsgiserver 오류 발생 시 아래의 글을 참고하여 오류를 해결.
2023.04.08 - [오류 해결] - ImportError: No module named wsgiserver 오류 해결방법
'Mobile App 취약점 진단 · 모의해킹 > AOS App 취약점 진단 · 모의해킹' 카테고리의 다른 글
녹스(Nox) 버프슈트 프록시 연결 및 인증서 설치 방법 (0) | 2023.08.08 |
---|---|
안드로이드 APK 파일 인증서 등록 방법 정리 (0) | 2023.04.11 |
안드로이드 APK 파일 디컴파일/리패키징 방법 (0) | 2023.04.11 |
안드로이드 앱(app)으로부터 apk 파일 추출 방법 정리 (0) | 2023.04.11 |
안드로이드 DIVA 설치 및 실행방법 정리 (0) | 2023.04.09 |