Technicolor TG799Vac: A deep dive by wuseman
Welcome to my in-depth README for the TG799Vac Xtream v3, a comprehensive document crafted through extensive reverse engineering and ethical hacking. This guide is the culmination of my personal efforts and contains a wealth of knowledge, including custom scripts, detailed tutorials, and unique insights into the router's functionalities.
Disclaimer
This README is a personal document created solely based on my experiences and expertise. It is important to note that I do not guarantee the accuracy or reliability of the information provided. The procedures and methods described herein reflect my individual approach and may not necessarily be applicable or safe for all users or systems. Anyone choosing to follow the instructions or use the information provided does so at their own risk. I cannot be held responsible for any consequences, damages, or losses resulting from the use of this guide.
Purpose
The primary goal of this document is to serve as a personal repository of knowledge for my own reference. However, it's crafted with the utmost care and attention to detail, making it a professional and serious guide for those with a deep interest in understanding or modifying the TG799Vac.
While this README remains private and is intended for my use, it is structured to meet high standards of clarity and professionalism, should it be shared with select individuals.
Copy/Paste video - Flashing VDNT-O
Dangerous: This will overwrite bank_1
and bank_2
#!/usr/bin/env bash
# - iNFO -------------------------------------------------
#
# Author....: wuseman <wuseman@nr1.nu>
# Created....: 2023-12-16 (23:10:05)
# License....: MIT
#
# --------------------------------------------------------
get_first_line_hex() {
hexdump -C /dev/mtd3 -n 100 | head -n 1
}
echo "Checking initial state..."
initial_hex=$(get_first_line_hex)
echo "Initial: $initial_hex"
echo "Starting dd command..."
dd if=/dev/urandom of=/dev/mtd3 &
DD_PID=$!
sleep 3
kill $DD_PID
echo "dd command completed."
echo "Checking final state..."
final_hex=$(get_first_line_hex)
echo "Final: $final_hex"
if [ "$initial_hex" != "$final_hex" ]; then
echo -e "[\e[1;32m*\e[0m] - /dev/mtd3 been successfully overwritten.."
else
echo -e "[\e[1;31m*\e[0m] - /dev/mtd3 has not been overwritten, exiting.."
exit
fi
- Overwrite
bank_2
with random data for 3 seconds
#!/usr/bin/env bash
# - iNFO -------------------------------------------------
#
# Author....: wuseman <wuseman@nr1.nu>
# Created....: 2023-12-16 (23:10:05)
# License....: MIT
#
# --------------------------------------------------------
get_first_line_hex() {
hexdump -C /dev/mtd4 -n 100 | head -n 1
}
echo "Checking initial state..."
initial_hex=$(get_first_line_hex)
echo "Initial: $initial_hex"
echo "Starting dd command..."
dd if=/dev/urandom of=/dev/mtd4 &
DD_PID=$!
sleep 3
kill $DD_PID
echo "dd command completed."
echo "Checking final state..."
final_hex=$(get_first_line_hex)
echo "Final: $final_hex"
if [ "$initial_hex" != "$final_hex" ]; then
echo -e "[\e[1;32m*\e[0m] - /dev/mtd4 been successfully overwritten.."
else
echo -e "[\e[1;31m*\e[0m] - /dev/mtd4 has not been overwritten, exiting.."
exit
fi
Wipe /overlay/*
directories
rm -rf /overlay/*
Preserve Root Access
mkdir -p /overlay/$(cat /proc/banktable/booted)/etc
chmod 755 /overlay/$(cat /proc/banktable/booted) /overlay/$(cat /proc/banktable/booted)/etc
echo -e "echo root:root | chpasswd
sed -i 's#/root:.*\$#/root:/bin/ash#' /etc/passwd
sed -i -e 's/#//' -e 's#askconsole:.*\$#askconsole:/bin/ash#' /etc/inittab
uci -q set \$(uci show firewall | grep -m 1 \$(fw3 -q print | \
egrep 'iptables -t filter -A zone_lan_input -p tcp -m tcp --dport 22 -m comment --comment \"!fw3: .+\" -j DROP' | \
sed -n -e 's/^iptables.\+fw3: \(.\+\)\".\+/\1/p') | \
sed -n -e \"s/\(.\+\).name='.\+'$/\1/p\").target='ACCEPT'
uci add dropbear dropbear
uci rename dropbear.@dropbear[-1]=afg
uci set dropbear.afg.enable='1'
uci set dropbear.afg.Interface='lan'
uci set dropbear.afg.Port='22'
uci set dropbear.afg.IdleTimeout='600'
uci set dropbear.afg.PasswordAuth='on'
uci set dropbear.afg.RootPasswordAuth='on'
uci set dropbear.afg.RootLogin='1'
uci set dropbear.lan.enable='0'
uci set web.usr_Administrator.role='superuser'
uci commit web
uci commit dropbear
uci set system.@system[0].log_host='192.168.1.100'
uci set system.@system[0].log_port='514'
uci set system.@system[0].conloglevel='5'
uci set system.@coredump[0].reboot='1'
uci commit system
uci set upnpd.config.log_output='1'
uci commit upnpd
uci set clash.engineer.ssh='1'
uci set clash.engineer.telnet='1'
uci set clash.engineer.serial='1'
sed -i 's/^/#/g' /etc/dropbear/authorized_keys
uci set cwmpd.cwmpd_config.state='0'
uci commit cwmpd
uci set system.cfg01e48a.network_timezone='0'
uci set system.cfg01e48a.log_filter_ip='192.168.1.64'
uci set system.cfg01e48a.log_port='514'
uci set system.cfg01e48a.log_buffer_size='64'
uci set system.cfg01e48a.log_size='1024'
uci set system.cfg01e48a.log_file='/etc/log/messages'
uci set system.cfg01e48a.hw_reboot_count='1'
uci set system.cfg01e48a.sw_reboot_count='1'
uci set system.cfg01e48a.log_host='192.168.1.66'
uci set system.cfg01e48a.conloglevel='0'
uci commit system
/etc/init.d/dropbear enable
/etc/init.d/dropbear restart
rm /overlay/\$(cat /proc/banktable/booted)/etc/rc.local
source /rom/etc/rc.local
" > /overlay/$(cat /proc/banktable/booted)/etc/rc.local
chmod +x /overlay/$(cat /proc/banktable/booted)/etc/rc.local
sync
mkdir -p /overlay/$(cat /proc/banktable/notbooted)/etc
chmod 755 /overlay/$(cat /proc/banktable/notbooted) /overlay/$(cat /proc/banktable/notbooted)/etc
echo -e "echo root:root | chpasswd
sed -i 's#/root:.*\$#/root:/bin/ash#' /etc/passwd
sed -i -e 's/#//' -e 's#askconsole:.*\$#askconsole:/bin/ash#' /etc/inittab
uci -q set \$(uci show firewall | grep -m 1 \$(fw3 -q print | \
egrep 'iptables -t filter -A zone_lan_input -p tcp -m tcp --dport 22 -m comment --comment \"!fw3: .+\" -j DROP' | \
sed -n -e 's/^iptables.\+fw3: \(.\+\)\".\+/\1/p') | \
sed -n -e \"s/\(.\+\).name='.\+'$/\1/p\").target='ACCEPT'
uci add dropbear dropbear
uci rename dropbear.@dropbear[-1]=afg
uci set dropbear.afg.enable='1'
uci set dropbear.afg.Interface='lan'
uci set dropbear.afg.Port='22'
uci set dropbear.afg.IdleTimeout='600'
uci set dropbear.afg.PasswordAuth='on'
uci set dropbear.afg.RootPasswordAuth='on'
uci set dropbear.afg.RootLogin='1'
uci set dropbear.lan.enable='0'
uci set web.usr_Administrator.role='superuser'
uci commit web
uci commit dropbear
uci set system.@system[0].log_host='192.168.1.100'
uci set system.@system[0].log_port='514'
uci set system.@system[0].conloglevel='5'
uci set system.@coredump[0].reboot='1'
uci commit system
uci set upnpd.config.log_output='1'
uci commit upnpd
uci set clash.engineer.ssh='1'
uci set clash.engineer.telnet='1'
uci set clash.engineer.serial='1'
sed -i 's/^/#/g' /etc/dropbear/authorized_keys
uci set cwmpd.cwmpd_config.state='0'
uci commit cwmpd
uci set system.cfg01e48a.network_timezone='1'
uci set system.cfg01e48a.log_filter_ip='192.168.1.66'
uci set system.cfg01e48a.log_port='514'
uci set system.cfg01e48a.log_buffer_size='64'
uci set system.cfg01e48a.log_size='1024'
uci set system.cfg01e48a.log_file='/etc/log/messages'
uci set system.cfg01e48a.hw_reboot_count='1'
uci set system.cfg01e48a.sw_reboot_count='1'
uci set system.cfg01e48a.log_host='192.168.1.66'
uci set system.cfg01e48a.conloglevel='5'
uci commit system
/etc/init.d/dropbear enable
/etc/init.d/dropbear restart
rm /overlay/\$(cat /proc/banktable/notbooted)/etc/rc.local
source /rom/etc/rc.local
" > /overlay/$(cat /proc/banktable/notbooted)/etc/rc.local
chmod +x /overlay/$(cat /proc/banktable/notbooted)/etc/rc.local
sync
Download firmware and create a raw binary file
cat "VBNT-H-2024-08.23.rbi" | (bli_parser && echo "Please wait..." && (bli_unseal | dd bs=4 skip=1 seek=1 of="../binary-rom/VBNT-H-2024-08.23.rbi"))
magic_value: BLI2
fim: 23
fia: Z8
prodid: 0
varid: 0
version: 0.0.0.0
data_offset: 379
data_size: 26825386
timestamp: 0x2BDE44A7
boardname: VBNT-H
prodname: Technicolor TG799vac Xtream
varname: TG799vac Xtream
tagparserversion: 200
flashaddress: 0x2000000
Please wait...
Write firmware to Bank_1
and Bank_2
#!/usr/bin/env bash
# - iNFO --------------------------------------
#
# Author: wuseman <wuseman@nr1.nu>
# Created: 2024-02-26 (04:51:26)
# License: MIT
#
# ---------------------------------------------
# Mount drive if needed
if ! grep -q sda /proc/mounts; then
echo "Mounting /dev/sda1";
mount /dev/sda1 /mnt/
fi
# Define variables for the firmware file and its path
firmware_path="/mnt/technicolor/vdnt-o/binary-rom"
firmware_file="VDNT-O.bin"
full_firmware_path="${firmware_path}/${firmware_file}"
# Assign the currently booted partition to a variable
not_booted_partition=$(cat /proc/banktable/notbooted)
# Check if the variable is not empty and the firmware file exists
if [ -n "$not_booted_partition" ] && [ -f "$full_firmware_path" ]; then
# Write the firmware to the booted partition
/sbin/mtd -e "$not_booted_partition" write "$full_firmware_path" "$not_booted_partition"
else
echo "Error: Non-booted partition is not set or firmware file does not exist."
fi
#!/usr/bin/env bash
# - iNFO --------------------------------------
#
# Author: wuseman <wuseman@nr1.nu>
# Created: 2024-02-26 (04:51:26)
# License: MIT
#
# ---------------------------------------------
# Mount drive if needed
if ! grep -q sda /proc/mounts; then
echo "Mounting /dev/sda1";
mount /dev/sda1 /mnt/
fi
# Define variables for the firmware file and its path
firmware_path="/mnt/technicolor/vdnt-o/binary-rom"
firmware_file="VDNT-O.bin"
full_firmware_path="${firmware_path}/${firmware_file}"
# Assign the currently booted partition to a variable
not_booted_partition=$(cat /proc/banktable/notbooted)
# Check if the variable is not empty and the firmware file exists
if [ -n "$not_booted_partition" ] && [ -f "$full_firmware_path" ]; then
# Write the firmware to the booted partition
/sbin/mtd -e "$not_booted_partition" write "$full_firmware_path" "$not_booted_partition"
else
echo "Error: Non-booted partition is not set or firmware file does not exist."
fi
Send Crash SysResq
command for reboot
echo c > /proc/sysrq-trigger
That's it! If you have followed this guide, you have now successfully upgraded your router to the latest firmware for both banks, and root access belongs to you.
Configure Router After First Boot
Connect to router
sshpass -p root root@192.168.1.1
Replace /etc/dropber/authorized_keys
with our own key
- This will remove the access for the
backdoor
orsupport backdoor
from the provider (who is the provider anyway?)
vi /etc/dropbear/authorized_keys
- Add your ssh key
Configure the local ~/.ssh/config
for the router
cat << "EOF" >> ~/.ssh/config
Host 192.168.1.1
user root
Hostname 192.168.1.1
IdentityFile ~/.ssh/router/id_rsa
KexAlgorithms +diffie-hellman-group1-sha1
PreferredAuthentications publickey,password
HostKeyAlgorithms ssh-ed25519-cert-v01@openssh.com,ssh-rsa-cert-v01@openssh.com,ssh-ed25519,ssh-rsa
PubkeyAcceptedKeyTypes +ssh-rsa
MACs hmac-sha1,hmac-md5
EOF
This command changes all occurrences of false to true for the specified patterns
find /www -type f -exec grep -iE 'canAdd = false|canApply = false|canEdit = false|canRemove = false|canDelete = false' {} +
# Previously I used below
## find /www -type f -exec grep -i 'canAdd = false' {} \;
## find /www -type f -exec grep -i 'canApply = false' {} \;
## find /www -type f -exec grep -i 'canEdit = false' {} \;
## find /www -type f -exec grep -i 'canRemove = false' {} \;
## find /www -type f -exec grep -i 'canDelete = false' {} \;
Warning: Important Notes
This command changes all occurrences of false to true for the specified patterns, regardless of the surrounding context. Ensure this is what you intend, as it may have significant effects on the behavior of your application. Always back up your files or test the command on a subset of files before running it across your entire /www directory, to prevent unintended changes. The -i flag for sed will edit your files in place, so consider using -i.bak
instead to keep a backup of the original files.
find /www -type f -exec sed -i -E 's/(canAdd = |canApply = |canEdit = |canRemove = |canDelete = )false/\1true/gi' {} +
find /www -type f -exec sed -i.bak -E 's/(canAdd = |canApply = |canEdit = |canRemove = |canDelete = )false/\1true/gi' {} +
Grep Method with Diff: Search and Replace in /www/modal
(Dry Run)
This example demonstrates using the grep
method along with diff
to search through all files in /www/modal
, replacing occurrences of "engineer" with "superuser" and previewing changes without actually modifying the files.
find /www -type f -exec grep -l 'engineer' {} \; | while read -r file; do
echo "Previewing changes for $file:"
# Create a temporary 'before' file
grep 'engineer' "$file" > /tmp/before.txt
# Create a temporary 'after' file by performing the substitution
sed 's/engineer/superuser/g' "$file" | grep 'superuser' > /tmp/after.txt
# Show lines that will be removed (exist in 'before' but not in 'after')
echo "Will be removed (or changed):"
grep -v -x -F -f /tmp/after.txt /tmp/before.txt
# Show lines that will be added (exist in 'after' but not in 'before')
echo "Will be added (or changed to):"
grep -v -x -F -f /tmp/before.txt /tmp/after.txt
echo "--------------------------------"
done
# Cleanup temporary files
rm /tmp/before.txt /tmp/after.txt
Search and Replace Without: Dry Run
This example demonstrates how to search through all files in /www
and replace occurrences of "engineer" with "superuser" without performing a dry run.
find /www -type f -exec grep -l 'engineer' {} + | while IFS= read -r file; do
echo "Previewing changes for $file:"
grep 'engineer' "$file"
sed -i 's/engineer/superuser/g' "$file"
echo "Changes applied to $file"
echo "--------------------------------"
done
Search and Replace with Diff Method: Dry Run
This example demonstrates how to perform a dry run of the search and replace operation, using the diff
method to preview changes, without actually modifying the files.
find /www -type f -exec grep -l 'engineer' {} + | while IFS= read -r file; do
echo "Previewing changes for $file:"
# Display the file name
grep 'engineer' "$file" > /dev/null
# Perform the replacement and compare with the original file side by side
sed 's/engineer/superuser/g' "$file" | diff -y "$file" -
echo "--------------------------------"
done
Add superuser
and admin
to engineering roles
#!/bin/sh
# Define roles to add
roles="superuser admin"
# Define modules
modules="web.systemmodal web.natalghelper web.xdsllowmodal"
# Add roles to modules
for role in $roles; do
for module in $modules; do
uci add_list "$module.roles='$role'"
done
done
OpenWRT Package Manager
- Delete distfeeds.conf
rm /etc/opkg/distfeeds.conf > /dev/null
- Update
customfeeds.conf
with correct repo sources
cat << "EOF" > /etc/opkg/customfeeds.conf
src/gz chaos_calmer_base http://archive.openwrt.org/chaos_calmer/15.05.1/brcm63xx/generic/packages/base
src/gz chaos_calmer_packages http://archive.openwrt.org/chaos_calmer/15.05.1/brcm63xx/generic/packages/packages
src/gz chaos_calmer_luci http://archive.openwrt.org/chaos_calmer/15.05.1/brcm63xx/generic/packages/luci
src/gz chaos_calmer_routing http://archive.openwrt.org/chaos_calmer/15.05.1/brcm63xx/generic/packages/routing
src/gz chaos_calmer_telephony http://archive.openwrt.org/chaos_calmer/15.05.1/brcm63xx/generic/packages/telephony
src/gz chaos_calmer_management http://archive.openwrt.org/chaos_calmer/15.05.1/brcm63xx/generic/packages/management
EOF
- Update
/etc/opkg.conf
for board vdnt-o specifik"
cat << "EOF" > /etc/opkg.conf
arch all 1
arch all 100
arch noarch 1
arch brcm63xx 3
arch brcm63xx-tch 10
arch brcm63xx 200
arch brcm63xx-tch 300
dest root /
dest ram /tmp
lists_dir ext /var/opkg-lists
option overlay_root /overlay
EOF
- Install
important
packages
opkg update
opkg install bash coreutils dropbearconvert nmap procps nano vim-full \
openssh-keygen openssh-client openssh-sftp-server ssh-keys sshfs
Add PS1
prompt for bash
echo 'export PS1="\[\033]0;\u@\h:\w\007\]\[\033[01;31m\]\u@\h\[\033[01;34m\] \w \$\[\033[00m\] "' > /root/.bashrc
. /root/.bashrc
Recent firmware can be downloaded from
Create Backup for mtd Partitions with Block Device Names
#!/bin/bash
# Create directory for backups
mkdir -p /mnt/sda/vdnt-o_2023/mtd
# Mount external storage
mount /dev/sda /mnt/sda/vdnt-o_2023
# Create backups of mtd partitions
dd if=/dev/mtd0 of=/mnt/sda/vdnt-o_2023/mtd/mtd0_brcmnand.0
dd if=/dev/mtd1 of=/mnt/sda/vdnt-o_2023/mtd/mtd1_rootfs.img
dd if=/dev/mtd2 of=/mnt/sda/vdnt-o_2023/mtd/mtd2_userfs.img
dd if=/dev/mtd3 of=/mnt/sda/vdnt-o_2023/mtd/mtd3_bank_1.img
dd if=/dev/mtd4 of=/mnt/sda/vdnt-o_2023/mtd/mtd4_bank_2.img
dd if=/dev/mtd5 of=/mnt/sda/vdnt-o_2023/mtd/mtd5_eripv2.img
dd if=/dev/mtd6 of=/mnt/sda/vdnt-o_2023/mtd/mtd6_rawstorage.img
dd if=/dev/mtd7 of=/mnt/sda/vdnt-o_2023/mtd/mtd7_blversion.img
Create Backup for mtdblock Partitions with Block Device Names
#!/bin/bash
# Create directory for backups
mkdir -p /mnt/sda/vdnt-o_2023/mtdblock
# Mount external storage
mount /dev/sda /mnt/sda/vdnt-o_2023
# Create backups of mtd partitions
dd if=/dev/mtd0 of=/mnt/sda/vdnt-o_2023/mtdblock/mtd0_brcmnand.0
dd if=/dev/mtd1 of=/mnt/sda/vdnt-o_2023/mtdblock/mtd1_rootfs.img
dd if=/dev/mtd2 of=/mnt/sda/vdnt-o_2023/mtdblock/mtd2_userfs.img
dd if=/dev/mtd3 of=/mnt/sda/vdnt-o_2023/mtdblock/mtd3_bank_1.img
dd if=/dev/mtd4 of=/mnt/sda/vdnt-o_2023/mtdblock/mtd4_bank_2.img
dd if=/dev/mtd5 of=/mnt/sda/vdnt-o_2023/mtdblock/mtd5_eripv2.img
dd if=/dev/mtd6 of=/mnt/sda/vdnt-o_2023/mtdblock/mtd6_rawstorage.img
dd if=/dev/mtd7 of=/mnt/sda/vdnt-o_2023/mtdblock/mtd7_blversion.img
Preserve Upgrade and SSH Access
Preserve Upgrade and SSH Access
mkdir -p /overlay/$(cat /proc/banktable/booted)/etc
chmod 755 /overlay/$(cat /proc/banktable/booted) /overlay/$(cat /proc/banktable/booted)/etc
echo -e "echo root:root | chpasswd
sed -i 's#/root:.*\$#/root:/bin/ash#' /etc/passwd
sed -i -e 's/#//' -e 's#askconsole:.*\$#askconsole:/bin/ash#' /etc/inittab
uci -q set \$(uci show firewall | grep -m 1 \$(fw3 -q print | \
egrep 'iptables -t filter -A zone_lan_input -p tcp -m tcp --dport 22 -m comment --comment \"!fw3: .+\" -j DROP' | \
sed -n -e 's/^iptables.\+fw3: \(.\+\)\".\+/\1/p') | \
sed -n -e \"s/\(.\+\).name='.\+'$/\1/p\").target='ACCEPT'
uci add dropbear dropbear
uci rename dropbear.@dropbear[-1]=afg
uci set dropbear.afg.enable='1'
uci set dropbear.afg.Interface='lan'
uci set dropbear.afg.Port='22'
uci set dropbear.afg.IdleTimeout='600'
uci set dropbear.afg.PasswordAuth='on'
uci set dropbear.afg.RootPasswordAuth='on'
uci set dropbear.afg.RootLogin='1'
uci set dropbear.lan.enable='0'
uci commit dropbear
/etc/init.d/dropbear enable
/etc/init.d/dropbear restart
rm /overlay/\$(cat /proc/banktable/booted)/etc/rc.local
source /rom/etc/rc.local
" > /overlay/$(cat /proc/banktable/booted)/etc/rc.local
chmod +x /overlay/$(cat /proc/banktable/booted)/etc/rc.local
sync
mtd -e $(cat /proc/banktable/booted) write "VDNT-O.bin" $(cat /proc/banktable/booted)
echo c > /proc/sysrq-trigger
Default Configuration
cat /proc/mtd
dev: size erasesize name
mtd0: 08000000 00020000 "brcmnand.0"
mtd1: 02300000 00020000 "rootfs"
mtd2: 01f80000 00020000 "userfs"
mtd3: 02b00000 00020000 "bank_1"
mtd4: 02b00000 00020000 "bank_2"
mtd5: 00020000 00020000 "eripv2"
mtd6: 00040000 00020000 "rawstorage"
mtd7: 00000003 00020000 "blversion"
cat: /etc/config/dropbear
config dropbear 'mgmt'
option PasswordAuth 'off'
option RootPasswordAuth 'on'
option Port '22'
option Interface 'mgmt'
option AllowedClientIPs '131.116.22.242/32 81.227.117.202/32 81.227.117.198/32 81.227.117.87/32 81.236.57.82/32'
option enable '1'
option IdleTimeout '3600'
config dropbear 'wan'
option PasswordAuth 'off'
option RootPasswordAuth 'on'
option Port '60022'
option Interface 'wan'
option AllowedClientIPs '131.116.22.242/32 81.227.117.202/32 81.227.117.198/32 81.227.117.87/32 81.236.57.82/32'
option enable '1'
option IdleTimeout '3600'
config dropbear 'lan'
option PasswordAuth 'on'
option RootPasswordAuth 'on'
option Port '60022'
option Interface 'lan'
option enable '0'
option IdleTimeout '3600'
config dropbear 'afg'
option enable '1'
option Interface 'lan'
option Port '22'
option IdleTimeout '600'
option PasswordAuth 'on'
option RootPasswordAuth 'on'
option RootLogin '1'
cat: /etc/dropbear/authorized_keys
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAgEA3VhXDw8oxKLUEctSKFaqNHHMbo59nBYXuvLaciQyIijk2B78v6t5LNkbZTCpjSIZZkCxcXh/L+Dyib0NJQ1E1dv5932prZfVz+ooXTYxkkJ0Ri9fmRKIiwDOrxYyYmNzglvKYNRcnC7M6RN6z4gU8ND8F3IO2WMtysJrXKQxZEahpN5UEVxi0KmjMM9NObEp0PT04PAZ3PYbgtodehpbboz65j8T/DzCT21j8Ns6BGe9wva1+S/G+3vUDERMhyV9/Ermlec+EwEqnjq7jl/pG/3tUH99RNyD6AuhmOQXJQRfFE3VcQV+tfSVz30gJHvhiH5kCIPFnU12iEYgjqZfZlb9ICCmeW2H59itjbuOGCF2Yi2q87JldMaoluVqQ5LKo/zjY4Vsed2elbExtEtVn8+iTSVXjx/ZqOPLIv5+2qQu3whTmuZJv3Q+4nBb08spoj6EWOiSMpVvuyUeO7JNYy1XBA7IGROrHC/kVdkAmJdXFB4PexVZTF60cTbrBizGVzzverlUdmSFvFlO+6TjFzwfIWg3eC6QpBaW5vnqZilSxqDrk5cPhV89R2vYdWjgKdMleWsk28DRVO8rIs+HArVR4FmKCxFd8SdFmmXfOXrQxfDJb3HbFayEnUc4GVdHIR34gt5L+Ku/8BeuRLxC2/1Wfz1dZeubw1+gpME03BM= TeliaCompany RGW key v2
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAgEA3e+i7L313ZRKP1BTU+wSlInCuwjR6iCmwiKD9aVdmGPwYcXwwBS33iWdjOxsGrLjbQZR1j9p95c4RpsgHJHTc3VreMDV2du3xMTGgQ4CMlm+L5NqY0Cw3zXYz7+Q194Oymd6L1GMqcfObkCwqmQaHWEFGImDHymnSlzo2Q3qZSzwRpSELhd64CTeAhbLDpWKyNPL36DHwFaqN2mJs/iLsR2EyxMd0oy3RZUjTg4XH2gbEQnGpxiEP45egkL0z8zOTXASWc1oZvF4hLCnns9osVIIHT0GvpZPRK9yGqJyky/ZvsVrceNKQ3OVYz4TVrVFBZ/WeE0UvyYHBEWw+gmkBFFkImJe2ZPYyKstdIzmt1OZzS7WbOIr8bi1iPOQ0FPsGR/5wqNQ7dk8+xHVtJh4Tw+vqpPZsglFy+edJFEGOO4TdLeJoI/ChdvBvESe9LJ71iId2eCeHs2252ibzR+zVd8kWKdjJVawFnY4aXt6cFMqmWvR9vuzK43wQKFb2A+c9tDvTICXPymu9h28bmpJ2/Ce9LsmOhh5zBxKAo38/D36+1S7651Aa07vC2v6pYyC2NDV/gihQAzIsBWd3wlbKIGgfsreCCUupDYRTAQC4tmzZ8szY5ulGtI6vbnNtlMIhBCwHFJ+KX2dm9KugSSLe6eD3TXQc4atxdsesFfK2T8= CHC
Install all LXC packages
liblxc luci-app-lxc lxc lxc-attach lxc-autostart lxc-cgroup lxc-checkconfig lxc-clone lxc-common lxc-config lxc-configs lxc-console lxc-create lxc-destroy lxc-execute lxc-freeze lxc-hooks lxc-info lxc-init lxc-ls lxc-lua lxc-monitor lxc-monitord lxc-snapshot lxc-start lxc-stop lxc-templates lxc-unfreeze lxc-unshare lxc-user-nic lxc-usernsexec lxc-wait