[VirusBulletin] Cryptojacking on the Fly: TeamTNT Using NVIDIA Drivers to Mine Cryptocurrency
TeamTNT는 클라우드 인프라를 추가로 열거하여 조직의 전용 환경에 침투하고 이를 공격 런치패드로 전환하기 위해 안전하지 않고 취약한 Kubernetes 배포를 공격한다.
본문에서는 상향된 마이닝 작업을 수행하기 위해 클러스터 노드에서 실행되는 공격된 포드에 관련 드라이버를 설치해 NVIDIA의 GPU 기능을 활용하기 위해 TeamTNT가 만 새로운 모듈을 소개한다.
암호화폐 채굴 작업을 위한 Kubernetes
- Exploit Unsecured Kubelet
최근 공격자가 Kubernetes 설치의 Kubelet 구성 요소를 표적으로 삼은 것 확인
인증 플래그가 True로 설정된 상태로 실행되기 때문에 누구나 kubelet을 인증할 수 있다는 것을 악용함
- Infect Configured Pods in the Node
Kubelet이 손상되면 노드에 구성된 Pod가 손상된다. 공격자는 권한을 상승 시켜 원격 명령 실행을 유발한다.
- Download Malicious Payloads
Pod 손상 후 공격자는 원격으로 악성 페이로드를 다운로드하여 공격자의 요구에 맞는 도구를 설치한다.
- Trigger C&C Operations
GPU 기능 향상을 위해 NVDIA 드라이버와 같은 새로운 패키지를 설치한다. 해당 작업으로 손상된 Pod를 무력화하고 작업에 기본 하드웨어를 활용하도록 한다.
- Execute Crypto Mining Operations
추가 드라이버 설치로 Pod 업데이트가 완료되면 암호화폐 채굴을 수행한다.
- Update Packages on Compromised Pods
악성 코드는 C&C 서버와 통신해 손상된 포드에서 민감한 데이터를 추출한다.
원격 서버 호스팅 packages
위처럼 Kubernetes 감염 도구 및 모듈을 호스팅 하는 원격 서버가 발견되었다.
NVDIA 설치 스크립트 분석
위 디렉토리 구조는 bash 스크립트의 존재를 강조함.
이 중 nvidia.sh 스크립트는 기본 하드웨어의 성능을 향상시키기 위해 NVIDIA 드라이버를 다운로드하고 설치하는데 사용한다.
base64로 문자열을 디코딩하고 NVIDIA 패키지를 가져온다.
패키지 | 설명 |
nvidia-headless-450 | 다른 패키지 위한 패키지 |
nvidia-driver-450 | NVDIA 450 시리즈 드라이버 서포트 |
nvidia-compute-utils-450 | NVDIA 드라이버와 함께 병렬 범용 컴퓨팅 사용 사례를 위한 유틸리티 바이너리 제공 |
nvidia-cuda-toolkit | 리눅스와 QNX에서 실행되는 CUDA 애플리케이션 디버깅을 위한 도구 |
위 스크립트는 변형이 되어서도 제공된다.
위 스크립트를 분석해보자
Querying metadata server
TeamTNT 는 아래 CURL 명령어를 활용해 구글 클라우드에 호스팅된 손상VM 에서 메타데이터 서버를 쿼리한다.
function get_metadata_value() {
curl --retry 5 \
-s \
-f \
-H "Metadata-Flavor: Google" \
"http://metadata/computeMetadata/v1/$1"
}
function get_attribute_value() {
get_metadata_value "instance/attributes/$1"
}
Installing Linux Kernel headers
function install_linux_headers() {
# Install linux headers. Note that the kernel version might be changed after
# installing the gvnic version. For example: 4.19.0-8-cloud-amd64 ->
# 4.19.0-9-cloud-amd64. So we install the kernel headers for each driver
# installation.
echo "install linux headers: linux-headers-$(uname -r)"
sudo apt install -y linux-headers-"$(uname -r)" || exit 1
}
Self deletion and file cleanup
손상된 시스템에 드라이버가 설치되면 드라이버의 흔적을 삭제하는 기능이 있다.
rm -f nvidia.sh 2>/dev/null 1>/dev/null
OS specific driver installation
Pod에 설치된 운영체제를 확인해 운영체제 별 드라이버를 설치할 수 있다.
main() {
install_linux_headers
# shellcheck source=/opt/deeplearning/driver-version.sh disable=SC1091
source "${DL_PATH}/driver-version.sh"
export DRIVER_GCS_PATH
# Custom GCS driver location via instance metadata.
DRIVER_GCS_PATH=$(get_attribute_value nvidia-driver-gcs-path)
if [[ "${OS_IMAGE_FAMILY}" == "${OS_DEBIAN9}" || "${OS_IMAGE_FAMILY}" == "${OS_DEBIAN10}" ]]; then
install_driver_debian
elif [[ "${OS_IMAGE_FAMILY}" == "${OS_UBUNTU1804}" ]]; then
install_driver_ubuntu
fi
NVIDIA drivers deployment on Ubuntu
install_driver_ubuntu()함수를 사용해 우분투용 NVIDIA 드라이버를 확인하고 설치한다.
# For Ubuntu OS
function install_driver_ubuntu() {
echo "DRIVER_UBUNTU_DEB: ${DRIVER_UBUNTU_DEB}"
echo "DRIVER_UBUNTU_PKG: ${DRIVER_UBUNTU_PKG}"
if [[ -z "${DRIVER_GCS_PATH}" ]]; then
DRIVER_GCS_PATH="gs://dl-platform-public-nvidia/${DRIVER_UBUNTU_DEB}"
fi
echo "Downloading driver from GCS location and install: ${DRIVER_GCS_PATH}"
set +e
gsutil -q cp "${DRIVER_GCS_PATH}" "${DRIVER_UBUNTU_DEB}"
set -e
# Download driver via http if GCS failed.
if [[ ! -f "${DRIVER_UBUNTU_DEB}" ]]; then
driver_url_path="https://developer.download.nvidia.com/compute/cuda/${DRIVER_UBUNTU_CUDA_VERSION}/local_installers/${DRIVER_UBUNTU_DEB}"
download_driver_via_http "${driver_url_path}" "${DRIVER_UBUNTU_DEB}"
fi
if [[ ! -f "${DRIVER_UBUNTU_DEB}" ]]; then
driver_url_path="https://us.download.nvidia.com/tesla/${DRIVER_VERSION}/${DRIVER_UBUNTU_DEB}"
download_driver_via_http "${driver_url_path}" "${DRIVER_UBUNTU_DEB}"
fi
if [[ ! -f "${DRIVER_UBUNTU_DEB}" ]]; then
echo "Failed to find drivers!"
exit 1
fi
wget -nv https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/cuda-ubuntu1804.pin
sudo mv cuda-ubuntu1804.pin /etc/apt/preferences.d/cuda-repository-pin-600
dpkg -i "${DRIVER_UBUNTU_DEB}" || {
echo "Failed to install ${DRIVER_UBUNTU_DEB}..exit"
exit 1
}
apt-key add /var/cuda-repo-*/*.pub || apt-key add /var/nvidia-driver*/*.pub || {
echo "Failed to add apt-key...exit"
exit 1
}
sudo apt update
sudo apt remove -y "${DRIVER_UBUNTU_PKG}"
sudo apt -y autoremove && sudo apt install -y "${DRIVER_UBUNTU_PKG}"
rm -rf "${DRIVER_UBUNTU_DEB}" cuda-update1804.pin
}
NVIDIA drivers deployment on Dibian
intall_driver_debian()함수를 사용해 데비안 용 NVIDIA 드라이버를 확인하고 설치한다.
# For Debian-like OS
function install_driver_debian() {
echo "DRIVER_VERSION: ${DRIVER_VERSION}"
local driver_installer_file_name="driver_installer.run"
local nvidia_driver_file_name="NVIDIA-Linux-x86_64-${DRIVER_VERSION}.run"
if [[ -z "${DRIVER_GCS_PATH}" ]]; then
DRIVER_GCS_PATH="gs://nvidia-drivers-us-public/tesla/${DRIVER_VERSION}"
fi
local driver_gcs_file_path=${DRIVER_GCS_PATH}/${nvidia_driver_file_name}
echo "Downloading driver from GCS location and install: ${driver_gcs_file_path}"
set +e
gsutil -q cp "${driver_gcs_file_path}" "${driver_installer_file_name}"
set -e
# Download driver via http if GCS failed.
if [[ ! -f "${driver_installer_file_name}" ]]; then
driver_url_path="http://us.download.nvidia.com/tesla/${DRIVER_VERSION}/${nvidia_driver_file_name}"
download_driver_via_http "${driver_url_path}" "${driver_installer_file_name}"
fi
if [[ ! -f "${driver_installer_file_name}" ]]; then
echo "Failed to find drivers!"
exit 1
fi
chmod +x ${driver_installer_file_name}
sudo ./${driver_installer_file_name} --dkms -a -s --no-drm --install-libglvnd
rm -rf ${driver_installer_file_name}
}
Non GCS API support: direct downloding via HTTP
HTTP 통신 채널을 통해 인터넷에서 직접 NVIDIA 드라이버를 가져온다. GCA API를 사용하여 드라이버를 가져올 수 없을 때 사용한다.
function download_driver_via_http() {
local driver_url_path=$1
local downloaded_file=$2
echo "Could not use Google Cloud Storage APIs to download drivers. Attempting to download them directly from Nvidia."
echo "Downloading driver from URL: ${driver_url_path}"
wget -nv "${driver_url_path}" -O "${downloaded_file}" || {
echo 'Download driver via Web failed!' &&
rm -f "${downloaded_file}" &&
echo "${downloaded_file} deleted"
}
}
엔비디아관련 글이길래 재밌어서 한창쓰고나니.. 2021년부터 관련 자료가 있었네..