Git Product home page Git Product logo

docker-explorer's Introduction

Docker Explorer

This project helps a forensics analyst explore offline Docker filesystems.

This is not an officially supported Google product.

If you're looking for similar capabilities on Containerd systems, feel free to check https://github.com/google/container-explorer.

Overview

When analyzing a system where a Docker container has been compromised, it can be useful to have the same view of the filesystem as the container's.

Docker uses layered backend filesystems like AuFS or OverlayFS.

Each layer is actually stored on the host's filesystem as multiple folders, and some JSON files are used by Docker to know what is what;

Installation

PPA

A .deb package is available in the GIFT PPA

add-apt-repository ppa:gift/stable
apt update
apt install docker-explorer-tools

PyPI

This project is released on PyPi.

virtualenv docker-explorer ; cd docker-explorer ; source bin/activate
pip install docker-explorer

Source

You can clone this repository, as running the script doesn't require any external dependency.

Usage

For the forensicator, this usually goes:

  1. find the interesting container ID
  2. mount the container's filesystem in /mnt/container
  3. log2timeline.py /tmp/container.plaso /mnt/container
  4. or ls -lta /mnt/container/tmp

List the running containers

On a live host running the compromised container you would run:

# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED         STATUS              PORTS               NAMES
7b02fb3e8a66        busybox             "sleep 10d"         19 hours ago    Up 19 hours                             dreamy_snyder

If you mount the disk image of the same host in /mnt/root, you can use de.py to access the same information:

# de.py -r /mnt/root/var/lib/docker list running_containers
[
    {
        "container_id": "7b02fb3e8a665a63e32b909af5babb7d6ba0b64e10003b2d9534c7d5f2af8966",
        "image_id": "7968321274dc6b6171697c33df7815310468e694ac5be0ec03ff053bb135e768",
        "image_name": "busybox",
        "start_date": "2016-09-16T11:50:15.253796"
    }
]

Mount the container's filesystem:

On a live host running the compromised container you would run:

# find ID of your running container:
docker ps

# create image (snapshot) from container filesystem
docker commit 12345678904b5 mysnapshot

# explore this filesystem using bash (for example)
docker run -t -i mysnapshot /bin/bash

If you mount the disk image of the same host in /mnt/root, you can use de.py to access the same information:

# de.py -r /tmp/ mount 7b02fb3e8a665a63e32b909af5babb7d6ba0b64e10003b2d9534c7d5f2af8966 /tmp
You'll needs the aufs-tools package. If you install aufs-tools, I can run these for you.

Whoops... Let's try again

# apt install aufs-tools
# de.py -r /tmp/ mount 7b02fb3e8a665a63e32b909af5babb7d6ba0b64e10003b2d9534c7d5f2af8966 /tmp/test
mount -t aufs -o ro,br=/tmp/docker/aufs/diff/b16a494082bba0091e572b58ff80af1b7b5d28737a3eedbe01e73cd7f4e01d23=ro+wh none /tmp/test
mount -t aufs -o ro,remount,append:/tmp/docker/aufs/diff/b16a494082bba0091e572b58ff80af1b7b5d28737a3eedbe01e73cd7f4e01d23-init=ro+wh none /tmp/test
mount -t aufs -o ro,remount,append:/tmp/docker/aufs/diff/d1c54c46d331de21587a16397e8bd95bdbb1015e1a04797c76de128107da83ae=ro+wh none /tmp/test
root@test-VirtualBox:~# ls /tmp/test
bin  dev  etc  home  proc  root  sys  tmp  usr  var

Show a container's image history

On the live host:

# docker history 7968321274dc6b6171697c33df7815310468e694ac5be0ec03ff053bb135e768
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
7968321274dc        4 weeks ago         /bin/sh -c #(nop)  CMD ["sh"]                   0 B
<missing>           4 weeks ago         /bin/sh -c #(nop) ADD file:707e63805c0be1a226   1.11 MB

On a disk image mounted in /mnt/root:

# de.py -r /mnt/root/var/lib/docker history 7b02fb3e8a665a63e32b909af5babb7d6ba0b64e10003b2d9534c7d5f2af8966
{
    "sha256:7968321274dc6b6171697c33df7815310468e694ac5be0ec03ff053bb135e768": {
        "container_cmd": "/bin/sh -c #(nop)  CMD [\"sh\"]",
        "created_at : "2018-09-20T18:41:05.770133",
        "size" : 0
    }
}

Troubleshooting

If on your Ubuntu system you get the errors:

mount: unknown filesystem type 'aufs'
/sbin/mount.aufs:proc_mnt.c:96: /mnt/aufs: Invalid argument
/sbin/mount.aufs:proc_mnt.c:96: /mnt/aufs: Invalid argument
/sbin/mount.aufs:proc_mnt.c:96: /mnt/aufs: Invalid argument
/sbin/mount.aufs:proc_mnt.c:96: /mnt/aufs: Invalid argument
/sbin/mount.aufs:proc_mnt.c:96: /mnt/aufs: Invalid argument
/sbin/mount.aufs:proc_mnt.c:96: /mnt/aufs: Invalid argument
/sbin/mount.aufs:proc_mnt.c:96: /mnt/aufs: Invalid argument
/sbin/mount.aufs:proc_mnt.c:96: /mnt/aufs: Invalid argument
/sbin/mount.aufs:proc_mnt.c:96: /mnt/aufs: Invalid argument
....

Try this:

sudo apt-get install linux-image-extra-$(uname -r)

Maintainer notes

Gift PPA push

Make sure the following is installed:

sudo apt install dh-python flex byacc quilt

For the GPG signing part, running over SSH with a gpg-agent running might confuse gpg and ask for the passphrase on the $DISPLAY. To prevent this, you can run gpgconf --kill gpg-agent.

Make a new version tag:

DATE="$(date +%Y%m%d)"
git checkout main
git pull upstream main
git tag "${DATE}"
git push upstream "${DATE}"

Build with l2tdevtools.

cd /tmp
git clone https://github.com/log2timeline/l2tdevtools

Make the build environment:

mkdir /tmp/build ; cd /tmp/build

First we need 2 files, post-dpkg-source.sh:

cat <<EOF >post-dpkg-source.sh
PROJECT=\$1;
VERSION=\$2;
VERSION_SUFFIX=\$3;
DISTRIBUTION=\$4;
ARCHITECTURE=\$5;

dput ppa:docker-explorer-dev-team_staging ../\${PROJECT}_\${VERSION}-1\${VERSION_SUFFIX}~\${DISTRIBUTION}_\${ARCHITECTURE}.changes
EOF

and prep-dpkg-source.sh:

cat <<EOF >prep-dpkg-source.sh
export NAME="Docker-Explorer devs";
export EMAIL="[email protected]";

PROJECT=\$1;
VERSION=\$2;
VERSION_SUFFIX=\$3;
DISTRIBUTION=\$4;
ARCHITECTURE=\$5;

dch --preserve -v \${VERSION}-1\${VERSION_SUFFIX}~\${DISTRIBUTION} --distribution \${DISTRIBUTION} --urgency low "Modifications for PPA release."
EOF

These are also stored in /tmp/build

Then go to https://github.com/google/docker-explorer/releases and create a new release.

Start the build:

PYTHONPATH=. python3 tools/build.py --build-directory=/tmp/build/  --project docker-explorer dpkg-source --distributions focal,jammy,kinetic

Then upload the packages to the PPA:

cd /tmp/build/
dput ppa:docker-explorer-devs_staging docker-explorer_<VERSION>_source.changes

Then wait for launchpad to build the package, and move it from ppa:docker-explorer-dev-team_staging to ppa:gift_stable, by going to https://launchpad.net/~docker-explorer-devs/+archive/ubuntu/staging/+copy-packages

Upload to PyPi

First make sure the proper version is set in docker-explorer/__init__.py.

Then run

sudo apt install twine
python3 setup.py sdist
python3 -m twine upload  dist/*

docker-explorer's People

Contributors

aarontp avatar jonathan-greig avatar meeehow avatar rgayon avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

docker-explorer's Issues

mountID not set on docker v1

I might be misreading the code, but I can't see where mount_id is set in the container if docker version == 1.
I only see mount_id set here:

self.mount_id = mount_id_file.read()

in a branch of code that gets triggere on Docker v2. Since mount_id is used widely across the various build commands, do they actually work against V1? Is it expected that it might be null? (I do not have a Docker V1 around to test)

Mount all containers to a directory

It would be nice to have a --mount-all that would mount the FS of all container to given directory, e.g. /mnt/docker-all/container1, /mnt/docker-all/container2, etc.

Python 3 incompatibility?

NameError: name 'raw_input is not defined

File: "/usr/local/lib/python3.5/site-packages/docker-explorer-20180518-py3.5.egg/docker_explorer/lib/storage.py", line 128, in Mount

Implement devicemapper storage

Source:
https://www.slideshare.net/JoelLathrop2/docker-forensics

Once LVM has settled:

cont_id="whatevs"
m=$(cat /var/lib/docker/image/devicemapper/layerdb/mounts/$cont_id/mount-id)
$d=$(jq ".device_id" /var/lib/docker/devicemapper/metadata/$m)
$size=$(jq ".size" /var/lib/docker/devicemapper/metadata/$m)
dmsetup create thin-$cont_id --table "0 $s thin /dev/mapper/docker-thinpool $d"
mount -o ro,nouuid /dev/mapper/thin-$cont_id /mnt/$cont_id/

MountPoints in container configs are not mounted by docker-explorer

Docker Explorer didn't mount the mount points inside the container config file and I had to mount it manually. Here is a redacted copy of the config file.

"MountPoints": {
        "/var/www/html": {
            "Destination": "/var/www/html",
            "Driver": "local",
            "ID": "[VOLUME_ID]",
            "Name": "[VOLUME_NAME]",
            "RW": true,
            "SkipMountpointCreation": false,
            "Source": "",
            "Spec": {},
            "Type": "volume"
        }
  • Docker automatically mount /var/www/html to /media/disk/var/lib/docker/volumes/[VOLUME_NAME]/_data however docker explorer didn't do it as part of the container mount operation, and I had to do it manually.

Better detect overlay/overlay2 layouts

When processing an image that has both and "overlay2" and "overlay" folder it will take the "overlay2" folder by default even though there is no 'mounts' subfolder.

'DockerExplorerTool' object has no attribute 'docker_directory'

Trying to list containers locally:

sudo PYTHONPATH=$PYTHONPATH:. python tools/de.py -r /var/lib/docker list running_containers
Traceback (most recent call last):
File "tools/de.py", line 183, in
DockerExplorerTool().Main()
File "tools/de.py", line 159, in Main
self._explorer.SetDockerDirectory(self.docker_directory)
AttributeError: 'DockerExplorerTool' object has no attribute 'docker_directory'

Print overlays as part of container list

To be able to quickly tell which container an overlay belongs to please print the overlays as part of the containers output. (Instead of grep -r OVERLAYID /var/lib/docker)

overlay mount error: mount: special device overlay does not exist

de.py mount 6f51d96cdd2c /root/docker/docker-explorer/mnt
/bin/mount -t overlay overlay -o ro,lowerdir="/var/lib/docker/overlay2/44bbbf57e9be5c160d9addac59b51a83c35d90955b4179ca4d893ae2942ef8e1/diff:/var/lib/docker/overlay2/l/F74KTIZFM3OJPZ44L4Y5OMLQRY:/var/lib/docker/overlay2/l/MULY352PDKNLWPYT22DFGHCJXA:/var/lib/docker/overlay2/l/ZH325HA5PVVFXEPQCWG6VTKIZ3:/var/lib/docker/overlay2/l/HFQVPV3GII75YHNJBJAJBMOMIZ:/var/lib/docker/overlay2/l/BXKFWQ4WPHOZMZHHD6TFT3ITZ7:/var/lib/docker/overlay2/l/KABGVLKHDM2RBUJKGPGWN3X7RU" /root/docker/docker-explorer/mnt
Do you want to mount this container ID: 6f51d96cdd2cff0601c5922917d4a62e593917cd5358d710a344111db1c1e354 on /root/docker/docker-explorer/mnt ?
(ie: run these commands) [Y/n]
Y
mount: special device overlay does not exist

OS: CentOS 7.5.1804
Kernel: 3.10.0-862.14.4.el7.x86_64
Docker: 1.13.1

docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6f51d96cdd2c atmoz/sftp "/entrypoint foo:p..." 4 days ago Up 4 days 0.0.0.0:4444->22/tcp sftp

Print a nice error message when dealing with a docker repo that has never run containers

I happened to run into this while targeting a local repo (which had never run any container, just downloaded an image)

$ sudo de.py -r /var/lib/docker list all_containers
Couldn't find any container configuration file ('{0:s}'). Make sure the docker repository ({1:s}) is correct. If it is correct, you might want to run this script with higher privileges.
Traceback (most recent call last):
File "/usr/local/bin/de.py", line 4, in
import('pkg_resources').run_script('docker-explorer==20180612', 'de.py')
File "/usr/lib/python2.7/dist-packages/pkg_resources/init.py", line 658, in run_script
self.require(requires)[0].run_script(script_name, ns)
File "/usr/lib/python2.7/dist-packages/pkg_resources/init.py", line 1445, in run_script
exec(script_code, namespace, namespace)
File "/usr/local/lib/python2.7/dist-packages/docker_explorer-20180612-py2.7.egg/EGG-INFO/scripts/de.py", line 304, in
File "/usr/local/lib/python2.7/dist-packages/docker_explorer-20180612-py2.7.egg/EGG-INFO/scripts/de.py", line 293, in Main
File "/usr/local/lib/python2.7/dist-packages/docker_explorer-20180612-py2.7.egg/EGG-INFO/scripts/de.py", line 232, in ShowContainers
File "/usr/local/lib/python2.7/dist-packages/docker_explorer-20180612-py2.7.egg/EGG-INFO/scripts/de.py", line 204, in GetContainersString
File "/usr/local/lib/python2.7/dist-packages/docker_explorer-20180612-py2.7.egg/EGG-INFO/scripts/de.py", line 179, in GetContainersList
File "/usr/local/lib/python2.7/dist-packages/docker_explorer-20180612-py2.7.egg/EGG-INFO/scripts/de.py", line 162, in GetAllContainers
AttributeError: 'NoneType' object has no attribute 'format'

The list repositories command works nicely under these conditions.

Check if we have permissions to docker folder

If the current use does not have permissions to the var/lib/docker/ docker-explorer will throw the following error:

2022-11-16 11:53:42,252 [ERROR] (MainProcess) PID:17960 Please specify a proper Docker directory path.

It would be useful to get error which mentions that we don't have permissions to this folder

Raise something more explicit when wrong Docker folder is passed

Something along the lines:

diff --git a/docker_explorer/lib/container.py b/docker_explorer/lib/container.py
index 5f926e1..5a7df25 100644
--- a/docker_explorer/lib/container.py
+++ b/docker_explorer/lib/container.py
@@ -81,8 +81,14 @@ class Container(object):
     container_info_json_path = os.path.join(
         self.docker_directory, 'containers', container_id,
         self.container_config_filename)
-    with open(container_info_json_path) as container_info_json_file:
-      container_info_dict = json.load(container_info_json_file)
+    try:
+      with open(container_info_json_path) as container_info_json_file:
+        container_info_dict = json.load(container_info_json_file)
+    except IOError as exception:
+      raise errors.BadContainerException(
+          'Unable to open configuration file {0} make sure you use the proper docker dir'.format(
+              container_info_json_path)
+      )
 
     if container_info_dict is None:
       raise errors.BadContainerException(

List repositories command doesn't work

$ de.py -r docker/ list repositories
Traceback (most recent call last):
  File "[...]/bin/de.py", line 257, in <module>
    DockerExplorerTool().Main()
  File "[...]/bin/de.py", line 250, in Main
    print(self.GetRepositoriesString())
AttributeError: 'DockerExplorerTool' object has no attribute 'GetRepositoriesString'

The bug appears to be here:

print(self.GetRepositoriesString())

Where it calls GetRepositoriesString() against self rather than the explorer object.

Issue with "list all_containers"

Ran the following using the "list all_containers":

python3 /usr/local/bin/de.py -r /mnt/flash/drive/var/lib/docker list all_containers

Traceback (most recent call last):
  File "/usr/local/bin/de.py", line 275, in <module>
    DockerExplorerTool().Main()
  File "/usr/local/bin/de.py", line 264, in Main
    self.ShowContainers()
  File "/usr/local/bin/de.py", line 180, in ShowContainers
    self._explorer.GetContainersJson(
  File "/usr/local/lib/python3.11/site-packages/docker_explorer/explorer.py", line 197, in GetContainersJson
    for container_object in self.GetContainersList(
                            ^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/docker_explorer/explorer.py", line 175, in GetContainersList
    self.GetAllContainers(), key=lambda x: x.start_timestamp)
    ^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/docker_explorer/explorer.py", line 157, in GetAllContainers
    containers_list.append(self.GetContainer(cid))
                           ^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/docker_explorer/explorer.py", line 132, in GetContainer
    return container.Container(
           ^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/docker_explorer/container.py", line 157, in __init__
    with open(mount_id_path, encoding='utf-8') as mount_id_file:
         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
FileNotFoundError: [Errno 2] No such file or directory: '/mnt/flash/drive/var/lib/docker/image/overlay2/layerdb/mounts/a66cc9e9a56b8c77c59096536fde76943cd7f608faac99c9bec3ff4dc57a022f/mount-id'

Looking at the error, I can confirm there is not a directory called "/mnt/flash/drive/var/lib/docker/image/overlay2/layerdb/mounts/a66cc9e9a56b8c77c59096536fde76943cd7f608faac99c9bec3ff4dc57a022f". Would you be able to have the tool produce an error message and then move on to the next item?

Crash when containers directory is empty. plz2fx

# /home/onager/.local/bin/de.py -r /media/disk/var/lib/docker/ list all_containers
Could not find container directoried in /media/disk/var/lib/docker/containers.
Make sure the docker directory (/media/disk/var/lib/docker/) is correct.
If it is correct, you might want to run this script with higher privileges.
Traceback (most recent call last):
  File "/home/onager/.local/bin/de.py", line 185, in <module>
    DockerExplorerTool().Main()
  File "/home/onager/.local/bin/de.py", line 162, in Main
    self._explorer.DetectDockerStorageVersion()
  File "/home/onager/.local/lib/python2.7/site-packages/docker_explorer/explorer.py", line 76, in DetectDockerStorageVersion
    self.containers_directory, container_ids_list[0])
IndexError: list index out of range

Containers directory is present, but empty

aufs mount broken?

Hi,
I'm not sure the workflow for aufs mount is working as intended?

Looking here:

container_id = os.path.join(

container_id is a path (i.e. there is no file read associated) which is then concatenated to other paths further down the code. That does not seem to be right, so I suspect that is meant to be a file read or something along those lines, but I'm not quite sure what without doing some reversing.

DE doesn't show the volume, where the mount mapped to.

If container has multiple mount points and each is mapped to a separate local volume, Docker explorer doesn't recognise the volume (from the Name attribute) and list it to the output with each MountPoint, it just list the upper_dir which is on a different Volume in that case, this lead to missing on existing data

"MountPoints": {
"/mnt/foo/bar": {
"Source": "",
"Destination": "/mnt/foo/bar",
"RW": true,
"Name": "1234",
"Driver": "local",
"Type": "volume",
"Spec": {},
"SkipMountpointCreation": false
},

Properly close files

See warning in travis:

/home/travis/build/google/docker-explorer/docker_explorer/container.py:170: ResourceWarning: unclosed file <_io.TextIOWrapper name='test_data/docker/graph/1cee97b18f87b5fa91633db35f587e2c65c093facfa2cbbe83d5ebe06e1d9125/layersize' mode='r' encoding='UTF-8'>
size = int(open(path).read())

Failing unit test testParseArguments

One of the unit tests is currently failing:

$ python tests.py 
.....................F....Error getting manifest for non/existing:image
..........................
======================================================================
FAIL: testParseArguments (__main__.TestDEMain)
Tests the DockerExplorerTool.ParseArguments function.
----------------------------------------------------------------------
Traceback (most recent call last):
  File "tests.py", line 99, in testParseArguments
    self.assertTrue(expected_usage in usage_string)
AssertionError: False is not true

----------------------------------------------------------------------
Ran 52 tests in 6.075s

FAILED (failures=1)

The test expects:

    expected_usage = (
        '[-h] [-d] [-r DOCKER_DIRECTORY] [-V]\n'
        '                {download,mount,list,history}')

But the actual output does not have a newline/indentation:

[-h] [-d] [-r DOCKER_DIRECTORY] [-V] {download,mount,list,history}

Cleanup the code

  • Split tests
  • Make tests docstrings more descriptive
  • Add end to end tests
  • Rename docker_version to storage_version
  • Hardcoded strings in tests should all follow the same format

error while mounting windows container which is not exited container

Hello,

i have one running windows container in windows machine.
i took the volume of the windows machine and trying to mount the running container,i see below error.

de.py -r /shared/volume/ProgramData/docker mount 954d7b6c9f99e6aa9ebaf71c23bdafc853d00c206db519076f97899d04115a89 /shared/954d7b6c9f99e6aa9ebaf71c23bdafc853d00c206db519076f97899d04115a89/
Warning: Due to differences in the Windows container implementation this
command will not actually mount the given container FS but will create a
mountable raw image:

954d7b6c9f99e6aa9ebaf71c23bdafc853d00c206db519076f97899d04115a89.raw

Which can then be mounted using standard tools.
Traceback (most recent call last):
File "/usr/bin/merge_vhdx.py", line 623, in
MergeVHDXTool().Main()
File "/usr/bin/merge_vhdx.py", line 606, in Main
child_disk = VHDXDisk(
File "/usr/bin/merge_vhdx.py", line 290, in init
self.bat_table = self._ParseBAT()
File "/usr/bin/merge_vhdx.py", line 421, in _ParseBAT
return BlockAllocationTable(bat_blocks, self.bat_params)
File "/usr/bin/merge_vhdx.py", line 193, in init
parsed_bat = self._ParseBATBytes(bat_bytes, bat_params)
File "/usr/bin/merge_vhdx.py", line 221, in _ParseBATBytes
parsed_entry = PayloadBlockBATEntry(bat_bytes[idx:idx+8])
File "/usr/bin/merge_vhdx.py", line 89, in init
self.state = self._parseState(bat_bytes)
File "/usr/bin/merge_vhdx.py", line 169, in _parseState
raise ValueError(f'Invalid state {state_int} for payload block entry')
ValueError: Invalid state 5 for payload block entry

Note: same command works well when we exit the container.

Thanks,
Vijay

Re-enable pylint disables

consider-using-f-string
unspecified-encoding
use-list-literal
redefined-outer-name
consider-using-with

Go from overlayFS ID to container ID

It would be useful to find a way to map an overlayFS ID to the container that actually used it.

e.g. given this path on a server running Docker:

/mnt/docker/var/lib/docker/overlay2/6688ce711806faead06aae3ff534ab21183a087241d3a890741f0c3b437b179c/diff/var/tmp/malware

Find out in which container 6688ce711806faead06aae3ff534ab21183a087241d3a890741f0c3b437b179c is being used.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.