I wouldn't recommend buying anything. There is certainly a linux tool that will work.
As suggested: dd, is the obvious choice. One thing I would say about dd though; depending on the size of the HDD you're copying it can be worth while experimenting with the block size option. Doesn't effect the end result, but may reduce the time required by a bunch.
I recommend starting with
dd if=source-device of=target-device bs=2M iflag=fullblock conv=fdatasyncwhich reads and writes in two-megabyte (2,097,152-byte) chunks, and ensures the data hits the target device before it returns (so if the target device is slow, like USB Flash or similar, there will be a delay after it is seemingly done before it returns, because it waits for the operating system to tell it has all been written to the target device before returning).
To check what device you should use, most Linux distributions include the util-linux package, which provides a nice command for this:
lsblk -atThe un-indented devices are the block devices (TYPE=disk), and the indented devices are the filesystems and partitions on them (TYPE=part or TYPE=crypt if encrypted) that are currently mounted.
If you want to check if
/dev/foo is the one you think it is, then
cat /sys/block/foo/device/transportwill tell you which bus it is connected with (PCIe, USB);
cat /sys/block/foo/device/modelwill tell you its model,
cat /sys/block/foo/device/vendorwill tell you its vendor/manufacturer (if known), and
cat /sys/block/foo/device/serialwill tell you its serial (if known).
If you are lazy like me, then you write a Bash script or alias that does
for dev in /sys/block/*/device ; do d="${dev%/*}" ; printf '%s:\n Model: %s\n Vendor: %s\n Serial: %s\n Transport: %s\n\n' "/dev/${d##*/}" "$(cat "$dev/model")" "$(cat "$dev/vendor")" "$(cat "$dev/serial")" "$(cat "$dev/transport")" ; done 2>/dev/nullwhich makes it quick and easy to identify which is which.