## 개요
리눅스 환경에서는 쉘이라는 특수한 환경이 존재한다. 물론 윈도우에서도 사용할 수는 있지만 GUI 위주의 환경을 이용하게되는 윈도우와는 다르게 리눅스나 맥 환경에서는 쉘이라는 CLI환경을 많이 사용할 수 밖에 없다. 쉘을 이용해본 사람은 알겠지만 위 화살표(☝️) 를 사용하면 이전에 사용했던 명령어들이 저장되어 별도로 입력하지 않더라도 다시 명령어를 사용할 수 있다.
이전에 사용했던 명령어를 재사용하는 것은 분명 어딘가에 저장되어 있다는 것을 의미한다. 그렇다면 생각해 보아야 하는 것은 이 데이터가 휘발성을 가지는지이다. 만약 휘발성 데이터라면 메모리 단계에서 얻어야 하는 정보가 될 것이고, 원하는 정보를 얻기 위해 꽤 복잡한 과정을 거쳐야 할 것이다. 비휘발성 데이터라면 파일의 형태나 변수의 형태로 어딘가에 저장되어 있을 것이다. 그럼 이걸 어떻게 확인하냐고? 쉽다. 컴퓨터를 꺼보면 된다. 컴퓨터를 종료한 다음 명령어가 기억되는지 확인해 보면 온전히 저장된 것을 확인할 수 있다.
이처럼 파일의 형태로 명령어가 저장되는데, 이때 명령어를 저장하는 파일의 이름이 history 파일이다. 쉘의 종류에 따라 이름에 조금씩 차이가 있다. 우리는 오늘 가장 많이 사용되는 쉘 중 하나인 Bash 쉘의 명령어 기록, Bash History에 대해 알아볼 것이다.
## 경로
명령어가 저장된 파일의 위치를 모르더라도 명령어를 확인해 볼 수는 있다. 이 때 사용하는 명령어가 `history` 명령어다. 이 명령어를 사용하면 이전에 입력한 명령어들을 확인해 볼 수 있다. 다만 이 방법은 bash history 파일을 출력해주는 값과 동일하며 이 방법으로는 기록된 파일의 시간정보를 확인할 수 없다는 단점이 있다.
그리하여 우리는 저장된 파일을 찾아야 한다. bash history 파일의 파일명은 `.bash_history` 이며 경로는 로그온된 사용자 기본 경로에 설정된다.
```
~/.bash_history
```
## 데이터
데이터에 대해 알아보기 전에 어떤 방식으로 데이터가 저장되는지부터 알아보자. 결론부터 이야기하면 로그온 된 순간에는 RAM에 데이터를 저장하고 있다. 로그오프가 될때 RAM에 저장된 데이터를 .bash_history파일로 옮겨 저장한다. 즉 부득이하게 시스템이 종료될 경우에는 데이터가 휘발될 수도 있다는 것을 인지하고 있자.
![[Pasted image 20231126164257.png]]
예시를 직접 보자. 컴퓨터를 재부팅 한 후, ls 명령어를 수차례 시도한 다음 출력한 bash_history 파일이다. 보는 바와 같이 reboot 이후의 명령어는 저장이 안된 것을 볼 수 있다. 그렇다면 이 상태에서 다시 재부팅을 시도해 보면 어떨까?
![[Pasted image 20231126164312.png]]
빨간색 박스 안에 있는것처럼 내용이 새로 업데이트 된 것을 확인해볼 수 있다. 그렇다면 메모리에 정보가 저장된다는 것을 확신할 수 있게 된다. 만약 메모리 덤프가 존재해서 분석할 수 있는 상황이라면 bash_history 부분을 따로 분석할 수 있게 될 것이다.
지금 분석하기에는 메모리 포렌식을 처음부터 다루어야 한다. 이는 다음 기회에 다뤄보도록 하고, 당장 메모리 분석을 해주는 도구를 참고해 보자. 자세한 내용은 [[Volatility#Linux]] 에서 찾아볼 수 있다.
[Volatility Download](https://github.com/Rajpratik71/volatility-wiki/blob/master/Linux-Command-Reference.md#linux_bash)
들어있는 데이터를 분석해보면 생각보다 심플하다. 명령어 말고는 다른 데이터가 없다. 포렌식에서 중요하기 여겨지는 명령어가 실행된 시간값이라든가.. 이런 중요한 데이터는 없다. 물론 시간값이 있도록 환경변수 포맷을 변경해 줄수는 있다.
HISTTIMEFORMAT 변수를 설정해주면 명령어에 대응되는 시간값을 확인해 볼 수 있다.
```
export HISTTIMEFORMAT="%F %T "
```
하지만 디지털 포렌식 관점에서 바라보았을 때는 일반 사용자를 가정해야 한다. 즉 이런 특수한 설정 없이도 저장되는 경우를 우선으로 취급해야 한다. 따라서 bash history파일에서는 명령어만이 저장된다는 정도를 기억하되, 특수하게 환경변수가 설정된 경우, 시간값이 존재할 수도 있음에 유념하자.
그렇다고 시간값이 존재하지 않는다고 해서 의미가 없는 데이터인가? 그것도 아니다. 특정 사용자 경로에 대해서 생성되는 파일이고, 해당 사용자가 실행한 명령어라는 것은 명백한 사실이므로 그 의미가 적지 않다. 쉘 환경에서 파일을 열거나 프로그램을 실행하는 것은 반드시 명령어의 형태로 전달되어야 하므로 그 흔적이 무조건적으로 남는다. 중요하다는 의미이다. 다만 중요한 만큼 안티 포렌식에 있어서나, 악성 코드 감염에 있어서 최우선적으로 제거되는 파일이니 복구에도 힘써볼 필요가 있다.
## 결론
사용했던 명령어가 저장되는 파일인 .bash_history 파일애 대해서 알아보았다. bash쉘에 대해서만 알아보았지만 다른 여러 쉘들도 비슷한 히스토리 파일이 존재하며 그 걍로 역시 상이하다. 아티팩트로써는 시간값이 디폴트로 존재하지 않는다는 점이 다소 아쉬웠으나 특수한 경우에는 시간값을 명령어와 같이 표시할 수 있다는 것을 명심해야겠다. 또 침해사고 대응의 큰 축을 담당하는 악성 코드나 해커의 침투에 있어서는 삭제 1순위인 파일이기도 하니 복구에 힘써보도록 하자.